Interaktion: Programm <-> DLL-Import <- DLL-Import



  • Verstehe langsam dein Problem.
    Was mich stutzig macht ist wozu das gut sein soll (GetModuleHandle(NULL)), das kann ja nicht funktionieren.

    Simon

    BTW: Ev. könnte mal ein Moderator diesen Thread ins WinAPI Forum evrschieben.



  • GetModuleHandle(NULL) holt eigentlich das Handle des Parent. D.h. es müsste theoretisch das Handle der "mittleren" DLL zurückgeben ... theoretisch 🙄

    und sorry für falsche Sparte 😞



  • GetModuleHandle(NULL) holt eigentlich das Handle des Parent.

    Ist mir ein wenig zu schwammig.

    Hier:

    msdn schrieb:

    If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file).

    Simon



  • hmpf ... d.h. es würde den Handle meines C#-Programms zurückgeben ... möcht ich ja nicht. Ich will ja nur über diese Zwischen-DLL eine Verbindung zwischen der unveränderbaren DLL und meinem C#-Programm aufbauen... D.h. die unveränderbare DLL ruft z.B. eine Funktion meines C#-Programmes auf. Dies geht nicht so ohne weiteres, deswegen hatte ich mir die Zwischen-Dll ausgedacht ...
    Hättest du ne andere Idee wie es gehen könnte? 😞



  • Ich denke, das geht so nicht.
    Der Code mit GetModuleHandle(NULL) ist Müll.
    Simon



  • naja gut ... da ich den nicht ändern kann wirds dann wohl nix werden. Muss ich das ganze mit C++ programmieren, da gehts 😞



  • so? bei mir gings nicht mit C++...
    simon



  • Ok habs hier mal als Beweis hochgeladen.

    Programm-Code:

    int _tmain(int argc, _TCHAR* argv[])
    {
    	MessageBox(0, L"Loading DLL + calling function", L"main application", 0);
    	HINSTANCE hDLL;               // Handle to DLL
    	LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
    	DWORD dwParam1;
    	UINT  uParam2, uReturnVal;
    
    	hDLL = LoadLibrary(L"SampleDocklet.dll");
    
    	if (hDLL != NULL)
    	{
    	   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "OnTest");
    	   if (!lpfnDllFunc1)
    	   {
    		  // handle the error
    		  FreeLibrary(hDLL);       
    		  return false;
    	   }
    	   else
    	   {
    		  // call the function
    		  lpfnDllFunc1();
    
    		  return true;
    	   }
    	}
    	Sleep(15000);
    	return 0;
    }
    
    void CheckIfApiWorks() {
    	MessageBox(0, L"it worked", L"main application", 0);
    }
    

    DLL-Code:

    void CALLBACK OnTest() {
    	MessageBox(0, "now calling api function", "from dll", 0);
    	TestApiFunction();
    }
    
    void TestApiFunction()
    {
    	typedef void(__stdcall *DUMMY_TYPEDEF)();
    
    	DUMMY_TYPEDEF TestFct = (DUMMY_TYPEDEF) GetProcAddress(GetModuleHandle(NULL), "CheckIfApiWorks");
    	if(!TestFct) {
    		MessageBox(0, "function not found!", "from dll", 0);
    		return;
    	}
    	MessageBox(0, "function found!", "from dll", 0);
    
    	TestFct();
    }
    

    jeweils OnTest bzw CheckIfApiWorks exportiert 🙂



  • Aha, jetzt verstehe ich dein Setup.
    Ich verstehe jedoch den Sinn überhaupt nicht.
    Zu was soll das gut sein?
    Simon



  • Das würde ja bedeuten, dass dein C# Programm die Funktion CheckIfApiWorks exportieren müsste. ➡ geht nicht...

    Oder Du machst (gemäss deinem Ansatz) eine Zwischen - DLL die genau CheckIfApiWorks exportiert, was aber wiederum nicht funktioniert, weil, das mit Modul Handle nicht mehr stimmt.

    Habe ich das korrekt verstanden?

    Was möchtest Du eigentlich bezwecken?

    Simon



  • Oder Du machst (gemäss deinem Ansatz) eine Zwischen - DLL die genau CheckIfApiWorks exportiert, was aber wiederum nicht funktioniert, weil, das mit Modul Handle nicht mehr stimmt.

    korrekt. Ich möchte eine Verbindung zwischen der unveränderbaren DLL und meinem C#-Programm aufbauen. Beide sollen jeweils Funktionen des anderen ausführen können. In der zwischen-DLL ist es ja auch möglich eine C#-Funktion aufzurufen. Ich benötige nur noch die Verbindung zwischen "mittlerer" DLL und der unveränderbaren ...

    (war anscheinend doch zu verwirrend mit den Bezeichnungen)



  • also keine weiteren ideen ... schade


Anmelden zum Antworten