[Hilfe] WIN32-DLL in WIN-Forms



  • Hey Leute,

    wollte mich mal mit der Einbindung von DLLs beschäftigen und weiß nicht mehr weiter:
    Ich habe mir eine DLL geschrieben:

    extern "C" __declspec(dllexport)int test(int a,int b);
    int test(int a,int b)
    {
    	return a+b;
    }
    BOOL APIENTRY DllMain(	HANDLE hModule,DWORD  ul_reason_for_call,LPVOID pReserved)
    {
    	return true;
    }
    

    und wollte diese in eine Windows-Forms Anwendung einbinden. In einer Konsolenanwendung läuft das einbinden wunderbar via extern "C" __declspec(dllimport)int test(int a,int b); jedoch geht dieses nicht in Windows-Forms?
    Gibt es dort eine möglichkeit die Funktion aufzurufen?
    PS: Ich benutze VS2010 Express



  • Hallo,

    es gibt dabei keinen Unterschied zwischen einer Konsolen- und WinForms-Anwendung.
    Was für einen Fehler erhältst du denn?



  • Ich kann mir vorstellen, dass das einbinden einer native DLL in managed Code an manchen Stellen Probleme mach kann. Zeige doch den Code, wie und wo Du die DLL eingebunden hast.



  • also ich hab es erstma

    extern "C" __declspec(dllimport)int test(int a,int b);
    

    im globalen Bereich deklartiert und dann wollte ich in main(...)

    test(10,20);
    

    aufrufen, jedoch gibt der compiler fehler aus:

    test.obj : error LNK2031: p/invoke konnte nicht für ""extern "C" int __clrcall test(int,int)" (?test@@$$J0YMHHH@Z)" generiert werden. In den Metadaten fehlt die Aufrufkonvention.
    1>test.obj : error LNK2028: Nicht aufgelöstes Token (0A00000B) ""extern "C" int __clrcall test(int,int)" (?test@@$$J0YMHHH@Z)", auf das in Funktion ""int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP01AP01APAAVString@System@@@Z)" verwiesen wird.
    1>test.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" int __clrcall test(int,int)" (?test@@$$J0YMHHH@Z)" in Funktion ""int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP01AP01APAAVString@System@@@Z)".
    1>C:\Projects\test\test.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.



  • Hast Du die *.lib (das ist die Import Lib) bei den Linker Settings eingetragen?

    Eine andere Möglichkeit geht über ein pragma:

    #pragma comment (lib, "meineBibliothek.lib")
    
    int main(/*etc.*/)
    {
    }
    

    Edit
    Du könntest mal probieren die Calling Convention explizit anzugeben:

    // export
    extern "C" __declspec(dllexport)int __cdecl test(int a,int b);
    
    // import
    extern "C" __declspec(dllimport)int __cdecl test(int a,int b);
    


  • @theta Vielen Dank!
    Es geht nun. Ich hatte die lib richtig eingebunden. Mit

    extern "C" __declspec(dllimport)int _cdecl test(int a,int b);
    

    hat es nun geklappt.


Anmelden zum Antworten