Funktion aus fremder .dll aufrufen
-
Bist du sicher dass der Prototype passt?
Und (nur weil ich neugierig bin): steht das Tw vielleicht für TouchWare?
-
hustbaer schrieb:
Bist du sicher dass der Prototype passt?
nein, nicht 100-prozentig. Hab das so aus der Header-Datei übernommen. Da steht:
TW_DAQ_API double TwGetDllVersion(void);
//returns the DLL versionhustbaer schrieb:
Und (nur weil ich neugierig bin): steht das Tw vielleicht für TouchWare?
Nein, Tw ist die Abkürzung der Firma, von der die dll stammt.
-
Erm. Wieso verwendest du nicht gleich das Original-Header-File?
Ansonsten... guck mal als was TW_DAQ_API definiert ist.
Vielleicht ist da noch ein__stdcalloder so mit drinnen?
-
Ist es nicht unter Windows so, dass Funktionen in DLLs immer als __stdcall definiert sein müssen?
-
njet.
-
314159265358979 schrieb:
Ist es nicht unter Windows so, dass Funktionen in DLLs immer als __stdcall definiert sein müssen?
Ist so Usus, aber Muss ist gar nix.
Kannst auch__cdecloder__fastcallmachen oder__super_new_calling_convention_that_only_my_compiler_supportsoder was auch immer.
Und natürlich__thiscall, hätte ich bald vergessen.
-
Hallo!
Ich hab jetzt DependencyWalker benutzt und festgestellt, dass die Funktionen in der dll mit einem Unterstrich anfangen

#include <cstdlib> #include <iostream> #include <windows.h> #include <TofDaqDll.h> #include <string> using namespace std; typedef double (_stdcall *FNPTR)(void); int main() { HINSTANCE hinstLibrary = LoadLibrary("TofDaqDll.dll"); FNPTR pFn; if (!hinstLibrary) { cout << "LoadLibrary failed: " << GetLastError() << endl; return 1; } pFn=(FNPTR)GetProcAddress(hinstLibrary, "_TwGetDllVersion"); if (!pFn) { cout << "GetProcAddress failed: " << GetLastError() << endl; return 1; } double result = pFn(); cout << result << endl; FreeLibrary(hinstLibrary); system("PAUSE"); return 0; }Das funktioniert soweit!
Vielen Dank für Eure Hilfe!Die anderen Funktionen der dll haben eine Rückgabevariable "TwRetVal". Wenn ich so eine Funktion aufrufe, bleibt das Programm beim Ausführen stehen. Wie gehe ich richtig mit diesem TwRetVal um?
-
Dazu müsste man nun wissen was TwRetVal ist, nen?
BTW: du musst auch nix dynamisch laden, mach einfach so
// extern "C" __declspec(dllimport) double TwGetDllVersion(void); extern "C" __declspec(dllimport) double __stdcall TwGetDllVersion(void);
-
darüber schweigt leider die dll-Beschreibung.
zum Befehl
TW_DAQ_API TwRetVal TwStartAcquisiton(void);
steht z.B.Return value type: TwRetVal
Value kann z.B. TwAcquisitonActive, TwTimeout, TwSuccess, TwError sein.
-
Hast du ein Header-File zu der DLL?
Ja?
Dann steht da drin wasTwRetValfür nen Typ hat.Ich meine, irgendwoher musst du doch auch wissen was
TwAcquisitonActive, TwTimeout, TwSuccess, TwErroretc. sein sollen. Das werden ja wohl Symbolische Konstanten sein (=Zahlen), aber welcher Name für welche Zahl steht kannst du ja schwer erraten.Und dort wo du die Zahlen zu den Namen findest, wirst du wohl auch finden was
TwRetValfür ein Typ ist.Und im Zweifelsfall halt
int, nen?