Netzwerkpfadproblem mit ShellExecute



  • Hallo, folgendes Problem:

    ich muss via C++ eine Accessdatenbank öffnen. Dies mache ich, indem ich den Pfad zur Accessdatenbank in eine ini-Datei schreibe, diesen Pfad dann auslese und ihn an ShellExecute übergebe. Funktioniert lokal auf mienem Rechner alles wunderbar, ohne Probleme. Liegt meine exe incl. ini und datenbank nun aber auf einem Server, so bekomme ich immer die Fehlermeldung: "The specified path was not found".
    folgender Code:

    #include <iostream>
    #include <Windows.h>
    #include <stdlib.h>
    #include <string>
    
    using namespace std;
    
    void main(int argc, char* argv[])
    {
    	Sleep(500);
    	char actualPath[256];
    	char pfad[100];
    	string pfadS = argv[0];
    	string pathOnly;
    	char pfadAusDatei[256];
    	char debug[2] = {'9','9'};
    
    	GetModuleFileName(NULL,actualPath,256);
    	pathOnly = pfadS.substr(0,(pfadS.length()-(pfadS.length()-pfadS.find_last_of('\\'))));
    	pfadS = pathOnly + "\\database.ini";
    
    	GetPrivateProfileString("database","pfad","Fehler!",pfadAusDatei,256,/*inidatei*/pfadS.c_str());
    	GetPrivateProfileString("database","debug","Fehler!",debug,256,pfadS.c_str());
    	if(debug[0] == '0')
    	{
    	}
    	else if (debug[0] == '1' )
    	{
    		cout << "Zu oeffnende Datei:" << pfadAusDatei << endl;;
    	}
    	else
    	{
    	}
    	cout << "Shellexecute:" << endl;
    	HINSTANCE test = ShellExecute(NULL,"open",pfadAusDatei,"/runtime",NULL,1);
    	int test2 = (int)test;
    	if(debug[0] == '1')
    	{
    	switch(test2)
    	{
    	case ERROR_FILE_NOT_FOUND:
    		cout << "The specified file was not found." << endl;
    		break;
    	case 0:
    		cout << "The operating system is out of memory or resources." << endl;
    		break;
    	case ERROR_PATH_NOT_FOUND:
    		cout << "The specified path was not found" << endl;
    		break;
    	case ERROR_BAD_FORMAT:
    		cout << "The .exe file is invalid (non-Win32 .exe or error in .exe image)." << endl;
    		break;
    	case SE_ERR_ACCESSDENIED:
    		cout << "The operating system denied access to the specified file." << endl;
    		break;
    	case SE_ERR_ASSOCINCOMPLETE:
    		cout << "The file name association is incomplete or invalid." << endl;
    		break;
    	case SE_ERR_DDEBUSY:
    		cout << "The DDE transaction could not be completed because other DDE transactions were being processed." << endl;
    		break;
    	case SE_ERR_DDEFAIL:
    		cout << "The DDE transaction failed." << endl;
    		break;
    	case SE_ERR_DDETIMEOUT:
    		cout << "The DDE transaction could not be completed because the request timed out." << endl;
    		break;
    	case SE_ERR_DLLNOTFOUND:
    		cout << "The specified DLL was not found." << endl;
    		break;
    	case SE_ERR_NOASSOC:
    		cout << "There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable." << endl;
    		break;
    	case SE_ERR_OOM:
    		cout << "There was not enough memory to complete the operation." << endl;
    		break;
    	case SE_ERR_SHARE:
    		cout << "A sharing violation occurred." << endl;
    		break;
    	default:
    		if(test2>32)
    		{
    			cout << "Datei erfolgreich geöffnet!" << endl;
    		}
    		else
    		{
    			cout << "Es ist ein unerwarteter Fehler aufgetreten!" << endl;
    
    		}
    	}
    	}
    
    	if (debug[0] == '1' )
    	{
    		cin.get();		
    	}
    }
    

    Der Pfad steht wie Folgt in der ini-Datei: "\\\Zentrale\_Q12\\P-Seminar\"

    kann mir da vllt irgendeiner weiterhelfen ? Bräuchte am besten bis morgen eine Lösung. Danke schon mal an alle im voraus.

    lg, Duck93



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Warum steht er in der Datei mit jeweils doppelten \ drin? Das muss man nur im *Code* so machen...



  • Weil wenn ich nur einen einfachen mache, dann nimmt er mir doch das Zeichen das direkt auf den "\" folgt als Argument (sowas wie \n für Zeilenumbruch, \t für einrücken etc..) oder etwa Nicht? Getestet habe ich es wie gesagt Lokal, und da MUSSTE ich bei Pfadangaben auch immer 2 x "\" machen. (z.B.: C:\\test\...)



  • Der Compiler interpretiert Escapesequenzen, wenn du jedoch eine Datei einliest, werden die einzelnen ASCII-Werte natürlich eingelesen (Backslash: 0x5C = 92dec).

    Ich könnte mir vorstellen, dass du den Wikipediapediaartikel über Escape-Sequenzen gelesen und über

    Durch den Einfluss der stark verbreiteten Programmiersprache C finden sich dieselben Escape-Sequenzen auch in anderen Zusammenhängen wieder, z. B. in Konfigurationsdateien.

    gestolpert bist.
    Dieser Satz ist imho auch ziemlich irreführend und sollte eigentlich mal umgeschrieben oder gleich gestrichen werden.



  • hmm.. nein eigentlich nicht. Verstehen ich das richtig so:

    pfadS = pathOnly + "\\database.ini";
    

    Hier sind die zwei "\" richitg, da dieser String durch den Compiler läuft und ansonsten das "d" von "database" als PArameter gesehen wird? Wenn ich jedoch den Pfad aus der ini lese, so wird diese 1:1 an die ShellExecute übergeben?
    Aber dann verstehe ich nicht, wieso das Programm auf einem lokalen Rechner wunderbar funktioniert, jedoch sobald ich auf einen Server zugreife, findet er den Pfad nicht. Das kann dann doch nicht nur mit den "\" zusammenhängen, oder? werde es morgen mal ohne testen, kann das im Moment nicht. Werde dann morgen nochmals bescheid geben, ob es funktioniert hat.

    Danke jedoch für die Belehrung.



  • Duck93 schrieb:

    Hier sind die zwei "\" richitg, da dieser String durch den Compiler läuft und ansonsten das "d" von "database" als PArameter gesehen wird?

    Ja.
    Im Code werden '\t', '\n' etc. vom Compiler als ein Zeichen interpretiert, wenn du Dateien mit entsprechendem Inhalt (Tabulatoren, Zeilenumbrüche, Backslashes etc.) einliest, ist dies nicht nötig, da der ASCII-Code eindeutig ist.

    Duck93 schrieb:

    Danke jedoch für die Belehrung.

    Sollte keine Belehrung sein, sondern maximal Erklärungsversuch 🙂 😃

    PS: Du kannst dir ja mal FormatMessage anschauen, um nicht selber alle Fehlercodes beschreiben zu müssen.



  • so, habe erz heute nochmals probiert und es hat wunderbar funktioniert mit nur einem" \". Danke für die Hilfe! Jedoch verstege ich immernoch nicht, wieso es mit zwei auf dem lokalen rechner funktioniert, und beim zugriff auf einen Server nicht. Aber fürs nächste mal weiß ichs ja jetzt 😉

    lg, Duck93



  • Bzgl. des Wikipedia-Artikels: Ich habe es zwar probiert, wurde aber abgewiesen 😞 .
    Ich finde dennoch, das dieser Satz deplaziert ist.


Anmelden zum Antworten