Interaktion: Programm <-> DLL-Import <- DLL-Import
-
ja, hab eben geschaut: ist exportiert ... wie gesagt, ich kann die Funktion auch aus c# aufrufen.
-
Ich verstehe nicht, warum Du mit GetModuleHandle(..) herumhantierst.
Warum nicht auch Load/Free Library?
Ist die DLL schon geladen (weil dazu gelinkt)?Ev. hilfts das:
http://blog.m-ri.de/index.php/2007/12/12/die-unsitte-immer-getmodulehandlenull-fuer-hinstance-in-createwindow-und-registerclass-zu-verwenden/Simon
-
naja ich will ja nicht noch einen neuen DLL-Handle erstellen, sondern einfach in der geladenen "mittleren" DLL, die der unveränderbaren übergeordnet ist, eine Funktion aufrufen...
Und wie gesagt kann ich an dem Code mit dem GetModuleHandle(NULL) nichts verändern
Der ist nicht von mir, die DLL bekomme ich - habe nur einen Codeauszug bekommenedit: hab jetzt eben mal ne kleine Konsolenanwendung geschrieben. Implementiere ich dort den selben Code, mit dem ich die unveränderbare DLL oben importiere, dann funktioniert es. Also scheint das GetModuleHandle(NULL) blos nicht das richtige Handle zur "mittleren" DLL zu finden ...
-
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