[Gelöst] ERROR_ACCESS_DENIED bei CreateFile(...)
-
Hallo Leute,
ich hab hier mal versucht, einen kleinen COM-Port Reader zu erstellen.
Aufgabenstellung wäre so ungefähr folgendes:(#define Serial COM // - Für die, die Serial-Port lieb haben)
Alle COM-Ports von 1 - range (Range ist eine Variable die der Benutzer definiert) werden überprüft.
Der Reader gibt dann jeweils eine Meldung aus ob der COM-Port vorhanden ist oder nicht([NO COMM]).
Wenn er vorhanden ist, soll der jeweilige "Status" ausgegeben werden:
[NO DEVICE], [DEVICE FOUND] oder [COMM ERROR:x] (x=Error Code by GetLastError).Mein Problem: Die Kommunikation funktioniert auf dem Entwicklungsrechner
(WinXp Pro SP3, .Net Framework 4.0) aber nicht auf dem Ziel-Rechner
(WinXp Pro SP3, .Net Framework 4.0).[NO COMM] und [NO DEVICE] werden richtig erkannt, bei angeschlossenen Geräten jedoch, tritt ein Fehler beim CreateFile(...)
Statement auf, den ich mir ausgeben lasse: ERROR_ACCESS_DENIED (Error Code 5).Bisher habe ich schon einige mögliche Ursachen gecheckt:
User hat Admin-Rechte
Auf beiden Rechnern ist UNICODE definiert (ich habe keinen besonders
portablen Code xD, und arbeiten mit CreateFileA brachte keinen Unterschied)
Kein anderes Programm, das auf die Schnittstelle zugreift wurde gestartet.
Gerät funktioniert. (getestet mit einem kleinen Tool namens GPS Information)
/fastdetect: Ist in der boot.ini eingetragen.Ach ja, das angeschlossene Gerät ist eine GPS-Antenne. Das ist auch der Grund, dass ich das Gerät leider nicht auf dem Entwicklungsrechner testen konnte.
Hoffe es ist nur irgendein "Ich bin doch so blind!" Fehler
Hier mal die wesentlichen Stellen des Code's:
(Sry für den mieserablen Progger-Stil, aber ich probiere seit vielleicht
3 Tagen WINAPI und musste mich wieder an das viele manuelle
von C/C++ gewöhnen ... von C# verwöhnt :P)Variablen:
LPCWSTR gszPort; HANDLE hComm; DWORD read = 0; char tmp[3] = ""; string com; wstring ws; unsigned short PortNr = 1;In einer Schleife wird einfach versucht, zu jedem COM-Port eine Verbindung herzustellen, bzw. herauszufinden warum dass nicht geht.
Zusammenbasteln des LPCWSTR mit Inhalt "COMx" (funktioniert).
s2ws konvertiert einfach string zu wstring.for(int i = 0; i < 10; i++) { cout << "Port " << setw(2) << (i+1) << ": "; com = "COM"; _itoa_s((int)(PortNr), tmp, 3, 10); com += tmp; ws = s2ws(com); gszPort = (LPCWSTR)(ws.c_str()); try_open(gszPort); } _getch();try_open - Funktion:
PS: ***** ist hier ein Platzhalter. Momentan experimentiere ich mit
Funktionen um eine Art "Verbindung steht?" Überprüfung zu bekommen...
Hier sind gute Vorschläge natürlich willkommen.bool try_open(LPCWSTR port) { HANDLE h; DWORD read = 0; SetLastError(NO_ERROR); h = CreateFile(port, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(h == INVALID_HANDLE_VALUE) { read = GetLastError(); if(read == ERROR_FILE_NOT_FOUND) cout << "[NO COMM]" << endl; else cout << "[COMM ERROR:" << (int)read << "]" << endl; } else { if(*****) { cout << "[DEVICE FOUND]" << endl; CloseHandle(h); return true; } else cout << "[NO DEVICE]" << endl; } CloseHandle(h); return false; }Danke schon im vorhinein und ich hoffe auf eine rasche Antwort.
mfg
joe
-
→→O M G←←
Habe die Lösung gefunden:
Das Zielsystem war ein Rechner mit Touchcreen und deswegen habe ich die Windows-Standard "On-Sreen-Keyboard", kurz Bildschirmtastatur, benutzt.DIESE STARTET EINEN FÜR DIE AUSFÜHRUNG NICHT NOTWENDIGEN PROZESS (msswchx.exe) DER DEN COM-PORT(COM1) BLOCKIERT HAT.
Prozess beendet --> Programm läuft einwandfrei.
--> Was lernen wir daraus... Windows ist böse xDmfg
joe