Externe DLL Funktion testen
-
Hallo!
für eine Anbindung einer Waage an eine Warenwirtschaftsprogramm benötige ich eine "einfache" DLL-Datei, die mir die Funktionen einer COMPORT-DLL anspricht. Das Warenwirtschaftssystem übergibt an eine DLL-Funktion immer 2 Parameter - ein vom Typ long und ein vom Typ unsigned char*. Ziel ist es, diese Parameter in ein Format umzuwandeln, was die Funktionen der PORT.DLL lesen kann.
Hier ein Beispiel:
In der PORT.DLL gibt es die Funktion OPENCOMM. Diese erwartet als Parameter einen Parameter-String z.Bsp. "COM1:9600,N,8,0". Ich benötige jetzt eine DLL, die 2 Parameter erhält und mit dem 2. Parameter die Funktion OPENCOMM aufruft.Um das Problem zu lösen, habe ich folgendes Skript für Visual Studio 6 erhalten:
extern "C" unsigned char* APIENTRY
XOPENCOMM(long dummy, unsigned char* argument)
{
portDLL = LoadLibrary("Port.dll");
OpenCommFunc = (PORTFUNC1)
GetProcAddress(portDLL, "OPENCOMM");
if (OpenCommFunc)
{
FreeLibrary(portDLL);
return 0;
}
else
{
uReturnVal = OpenCommFunc(argument);
return uReturnVal;
}
}Jetzt bekomme ich aber keinen Returnwert zurück. Es wird auch keine Fehlermeldung ausgegeben. Kann man über ein C++ testen, ob die Funktion XOPENCOMM überhaupt aufgerufen wird und funktioniert? Da ich ein absoluter Anfänger bei der C++-Programmierung bin, suche ich dringend Jemanden, der mir weiterhelfen kann.
Vielen Dank!
Ina
-
Hallo C++-Profis!
Hat denn Niemand einen Tipp für mich, an wen ich mich wenden könnte?
Verzweifelte Grüße
Ina
-
Falls Due den Quellcode für Deine DllS hast, würde ich Sie als Debug-Version erstellen. Dann die neuen Dll und Libarys in Dein Projekt kopieren und Dein Projekt noch mal neu kompilieren. Jetzt mal Deine Anwendung debuggen und beim Sprung in die Dll einen breakpoint setzen. Da jetzt Deine Dll als Debug-version vorhanden ist, müßeste Du mit Hilfe der Taste "F11" in dei Dll springen können und dort weiter den Code debuggen können.
Dies funktioniert jedenfalls bei mir, mit dem Entwicklungstool VC++
Hoffe ich konnte Dir weiter helfen.
Oli
-
Hallo Oli!
Danke für deinen Tipp. Meine DLL funktioniert erst mal. Jetzt habe ich nur noch mit der Port.DLL Probleme, die ich eigentlich ansprechen wollte. Die DLL wird zwar geöffnet, aber beim Zeiger auf eine Funktion (z.Bsp. OPENCOMM) wir als Adresse 0x00000...) angegeben. Sehe ich es richtig, wenn ich behaupte, dass er die Funktion nicht findet? Normalerweise müsste doch eine gültige Zeigeradresse im Debugger kommen, oder? Leider steht mit der Quelltext der DLL :p nicht zur Verfügung.
Gruß
Ina
-
Hallo.
Da hast Du recht. Die Funktion GetProcAdress() gibt eine NULL zurück, wenn sie Fehlgeschlagen ist. Rude danach mal die Funktion GetLastError() auf. Da bekommst Du eine Fehlernummer, die Dir in der Hilfe angibt, was falsch war.
Hoffe es hilft.
Oli