compilerproblem: "undefined reference to `GetOpenFileNameA@4'"



  • hi!

    ich habe versucht, in ein ANSI C-programm ein klein wenig WinAPI-code zu integrieren. sieht IMHO auch recht gut aus, aber compilen kann ich es nicht 😞

    ich bekomme dauernd beim compilen mit MingW die errormessage: "undefined reference to `GetOpenFileNameA@4'"...

    das hört sich für mich an, als wäre eine library nicht richtig eingebunden. aber ich habe einfach "windows.h" inkludiert, was laut MSDN reichen sollte.

    sorry, ich kenne mich mit compilern und libs/includes noch nicht so dolle aus...

    kann mir da jemand helfen?

    danke im voraus,

    ---loki

    /EDIT: zum besseren verständnis: ich benutze NUR die WinAPI-funktion "GetOpenFileName". ziel ist es, in das programm einfach einen simplen fileopen-dialog zu integrieren, der den selektierten datei-pfad+namen als variable speichert, damit der restliche code darauf zugreifen kann...



  • Hallo,

    loki1985 schrieb:

    ich habe versucht, in ein ANSI C-programm ein klein wenig WinAPI-code zu integrieren

    dann gehört deine Frage vielleicht schon nicht mehr unbedingt in dieses Forum, denn sobald eine API-Funktion enthalten ist, ist es kein ANSI-C-Programm mehr ;), denn eigentlich ist es eine Frage, wie beseitigt man Linker-Fehler

    Trotzdem: in der MSDN gibt es zu jeder Funktionsbeschreibung einen ganz wichtigen Abschnitt, nämlich "Requirements", und da steht im diesem Falle, du mußt comdlg32.lib zu den Bibliotheken für den Linker hinzufügen.

    MfG



  • Dieser Thread wurde von Moderator/in Shade Of Mine aus dem Forum ANSI C 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.



  • danke erstmal für die bisherigen infos 🙂 .
    ich habe mal nach der "comdlg32.lib" gesucht. habe ich nicht.
    muss ich dazu den Platform SDK von M$ runterladen? (die "Core"-variante, nehme ich mal an...)

    und mit welchem command binde ich diese .lib explizit ein? habe es schon mit "-L/user/local/lib -lcomdlg32.lib" und varianten probiert...
    wie genau?

    thx im voraus...

    ---loki



  • ich glaube schon, da0 du die hast, aber du mußt natürlich angeben, welchen Compiler du benutzt, dann kann man dir auch weiterhelfen. Schau also mal in dein Lib-Verzeichnis, ob da nicht ein comdlg32.a oder ähnliches herumliegt, es könnte z.B. so klappen:

    "-L/user/local/lib -lcomdlg32"

    MfG



  • so long, hat geklappt. das problem lag nicht wie vermutet an der lib (die wurde scheinbar automatisch inkludiert, durch "#define <windows.h>"...), sondern daran, dass ein objekt per commandline mitgelinkt werden musste.
    lässt sich alles brav compilen, habe noch ein paar warnings gefixt (herrliches gefühl! 😃 ), und ich kann die anwendung auch starten.

    leider kommt jetzt problem nummero 2:
    ich sehe nichts vom erwünschten file-open-dialog...
    stattdessen kommt nur die info, dass auf der commandline keine datei angegeben wurde. ich habe aber so umgecoded, dass die datei statt auf cmdline mit dem dialog angegeben wird.

    ich poste mal die benutzte funktion des dialoges (abkopiert aus der MSDN):

    #include "util.h"
    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {
    	FILE *ifp, *ofp;
    	unsigned long file_record_off, file_record_len;
    	unsigned long file_off, file_len;
    	unsigned long data_file_len;
    	const char *data_file_name;
    	char file_name[0x20];
    	char *buf;
    	unsigned long i;
    	int j;
    
    OPENFILENAME ofn;
    char szFile[260];
    HWND hwnd;
    HANDLE hf;
    
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = "All\0*.*\0";
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    if (GetOpenFileName(&ofn)==TRUE) 
        hf = CreateFile(ofn.lpstrFile, GENERIC_READ,
            0, (LPSECURITY_ATTRIBUTES) NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
            (HANDLE) NULL);
    

    das müsste doch alles ANSI-C-kompatibel sein, oder? ich bekomme davon einfach nix zu sehen, und verstehe nicht wieso.......



  • mach mal hier NULL

    ofn.hwndOwner = NULL;
    


  • super! vielen dank! jetzt funktioniert es!!!
    🙂


Anmelden zum Antworten