Hallo,
seit Tagen versuche ich eine unter Delphi entwickelte ISA-Geräteansteuerung (kleiner Microcontroller für das Verfahren in x- und y-Richtung) unter C++ zu benutzen. Leider bis jetzt erfolglos.
Der Delphi-Sourcecode steht mir zur Verfügung (kann die
dll daher modifizieren und neu erstellen), darf ihn aber maximal auszugsweise posten.
Los gehts mit einem kleinen Test-C++-Teil mit der dynamischen Einbindung der .dll:
schnipp
----------------
#include "windows.h"
typedef void (__stdcall* LPFNDLLFUNC3)();//prozeduraufruf
int main(...)
{
HINSTANCE hInstance = LoadLibrary("meinedll.dll");
LPFNDLLFUNC3 DLLFCT3;
if(hInstance==NULL)
return(0);
DLLFCT3=(LPFNDLLFUNC3)GetProcAddress((HMODULE hInstance, "Initialize");
if (!DLLFCT3){
FreeLibrary(hInstance);
return(0);}
DLLFCT3();
return(1);
}
---------------
schnapp
Die
dll wird geladen, die Funktion 'initialize' wird über sie geladen und problemlos ausgeführt. Problem: der Controller reagiert nicht!!
Der Delphi-Part ist riesig, ich versuche daher einen kleinen überblick zu geben: Die Erstellungsroutine für die
dll:
schnipp
---------------
library meinedll;
uses
SysUtils,
portio,
Classes;
type
...
TFwdSt = 0..3;
...
const
...
Bit_7 = $FE
...
var
...
iFwdSt = TFwdSt;
...
...
procedure Initialize;stdcall;
begin
//Initialisierungsroutine unter Verwendung von portio (portwrite, etc)
end
...
exports
...
Initialize,
...;
begin
end.
---------------
schnapp
Brauchen die eingebundenen prozeduren aus portio auch einen stdcall-Parameter?
Wichtig noch zu erwähnen, dass portio mittels CreateService auf einen .sys-Treiber zugreift, der bei der .dll im selben Verzeichnis liegt. Könnte das das Problem verursachen?
Den oben geposteten Code in C++ habe ich schon vielfach verändert, aber nie eine Reaktion des Controllers provozieren können. Hat jemand vielleicht Erfahrungen mit "runtime dynamic linking" in C mit Delphi-dlls?
Ich wäre wirklich dankbar für Anregungen, gerne poste ich noch ein paar Sachen mehr falls es nötig ist.
Gruß
Entropie