[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 xD

    mfg
    joe


Anmelden zum Antworten