Fehler - Verweis auf nicht aufgelöstes externes Symbol



  • Habe begonnen ein Programm in C++ zu schreiben welches Textdateien einlesen soll um damit zu arbeiten.
    Benutze die Funktion PathFileExists() um herauszufinden ob die Datei existiert.
    VS 2015 zeigt mir auch keine Fehler im Code an doch wenn ich das Programm debuggen will kommen immer zwei Fehlermeldungen:

    Kann mir Bitte jemand sagen wo der Fehler ist und wie ich ihn am besten behebe!

    LNK1120 "1 nicht aufgelöste Externe"

    LNK2019 "Verweis auf nicht aufgelöstes externes Symbol "_imp_PathFileExistsW@4" in Funktion "main"."

    Hier ist der gesamte Code den Ich bisher habe:

    #include "iostream"
    #include "fstream"
    #include <Shlwapi.h>
    #include <windows.h>
    #include <tchar.h>
    
    using namespace std;
    
    int main() {
    
    	Start:
    
    	char smallL[27] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','ß' };
    	char bigL[26] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };
    	int num[10] = { 1,2,3,4,5,6,7,8,9,0 };
    	char symbol[17] = { ' ','.',',',':',';','!','?','-','_','/','*','+','%','&','$','€','µ'};
    	char inp1[100];
    	LPCWSTR inp;
    	//char inp2[100];
    	//string inp4;
    
    	cout << "Geben sie den Dateipfad ein! \n";
    	cin >> inp1;
    
    	string input = inp1;
    	//cin.getline(inp4);
    
    	inp = (LPCWSTR)input.c_str();
    
    	//inp = TEXT( "",input );
    
    	if (cin.fail()) {
    		cin.clear();
    		cout << "Eingabe Fehlerhaft! Bitte versuchen Sie es erneut! \n";
    		goto Start;
    	}
    	else {
    		cout << "Überprüfe Dateipfad... \n";
    	}
    
    	if(!PathFileExists(inp)){
    		cout << "Datei nicht gefunden oder Zugriff verweigert! Bitte Versuchen Sie es mit einer anderen Datei erneut! \n";
    
    		goto Start;
    	}
    
    	return 0;
    }
    


  • Du musst noch die entsprechende Library linken. Welche das genau ist, findest du heraus, wenn du die Hilfeseite der PathFileExists(..) Funktion anschaust (ganz unten): https://msdn.microsoft.com/en-us/library/windows/desktop/bb773584(v=vs.85).aspx

    ➡ In diesem Fall ist das Shlwapi.lib

    Nun kannst du diese entweder über die Projekt-Einstellungen angeben oder im Code folgende Zeile einfügen (das funktioniert nur für Visual Studio):

    // includes...
    
    #pragma comment (lib, "Shlwapi.lib")
    
    int main()
    {
      // ...
    }
    


  • Vielen Dank!
    Das war das Problem. Jetzt funktioniert es.



  • Habe jetzt die Zeile eingefügt und bekommen auch keinen Fehler mehr aber egal was ich eingebe, es kommt immer die Meldung "Datei nicht gefunden oder Zugriff verweigert!" auch wenn die Datei existiert.
    Hat jemand eine Idee woran das liegen kann?

    Ich bekomme die selbe Meldung wenn ich in Zeile 38 die Variable Input überschreibe, also ist die Eingabe selbst nicht das Problem.

    Hier nochmal der bisherige Code:

    #include "iostream"
    #include "fstream"
    #include <Shlwapi.h>
    #include <windows.h>
    #include <tchar.h>
    
    #pragma comment (lib, "Shlwapi.lib")
    using namespace std;
    
    int main() {
    
    	Start:
    
    	char smallL[27] = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','ß' };
    	char bigL[26] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' };
    	int num[10] = { 1,2,3,4,5,6,7,8,9,0 };
    	char symbol[17] = { ' ','.',',',':',';','!','?','-','_','/','*','+','%','&','$','€','µ'};
    	char inp1[100];
    	LPCWSTR inp;
    
    	cout << "Geben sie den Dateipfad ein! \n";
    	cin >> inp1;
    
    	string input = inp1;
    
    	if (cin.fail()) {
    		cin.clear();
    		cout << " Eingabe Fehlerhaft! Bitte versuchen Sie es erneut! \n";
    		goto Start;
    	}
    
    	if (input == "exit") {
    		goto End;
    	}
    	else {
    		cout << " Überprüfe Dateipfad... \n";
    		//input = "D:\\hi\\hi.txt";
    	}
    
    	inp = (LPCWSTR)input.c_str();
    
    	if(PathFileExists(inp) == 1){
    		cout << "HI!";
    	}
    	else {
    		cout << " Datei nicht gefunden oder Zugriff verweigert! \n Bitte Versuchen Sie es mit einer anderen Datei erneut! \n";
    		cout << inp << "\n";
    
    		goto Start;
    	}
    
    	End:
    
    	return 0;
    }
    


  • Hallo,

    Du würfelst hier ANSI und Wide-Strings (Unicode) durcheinander. Deine diversen Variablen sind char oder std::string (ANSI), PathFileExists() will aber (da Du wohl Unicode in den Projekteinsetllungen hast) ein wide-string sehen. Deshalb hast Du ja auch den (LPCWSTR) cast drinnen, aber der konvertiert nicht etwa den Inhalt sondern schlägt nur den compilefehler tot.

    Zwei Optionen:
    Du stellst den ganzen Code auf wide-strings um, also char->wchar_t, std::string->std:wstring, cin->wcin usw
    Oder Du verwendest einfach die Ansi-Variante PathFileExistsA()

    Den string brauchst Du eigentlich nicht, kannst ja direkt inp1 verfüttern.

    Gruß,
    Matthias



  • Warum mixt du char-Arrays und std::string? Standardbibliotheken werden mit < > eingebunden, wer goto in C++ benutzt ist selbst schuld.


Anmelden zum Antworten