Dynamischer Zugriff auf eine dll
-
Ich habe so eine Typdefinition auch mal verwendet (auch für eine dll),
aber die sah bei mir in etwa so aus (auf Dein Problem angewandt):typedef int (__declspec(dllimport) TDPResult)(char*, char*);
Ich bin mir aber nicht sicher, ob's daran liegt, aber einen Versuch
ist es wert.Gruß,
Alexander
-
hallo,
ron, das theater hättest du dir sparen können, steht nämlich alles im tutorial genaus beschrieben, das mit dem unterstrich, und das man die klammern weglässt, das näxte mal lieber gucken bevor du überheblich sagst, "das kann ich für mein problem nicht brauchen..."
sonst vergeht mir die lust dir ein näxtes mal bei einem potentiellen weiteren problem noch mal helfen zu wollen, und die antworten solltest du auch genau durchlesen, das mit den klammern und dem unterstrich kam schon da hast du immer noch mit diesem komischen Ding "DbInit()" rumgemacht...mfg
murphy
-
murphy schrieb:
hallo,
ron, das theater hättest du dir sparen können, steht nämlich alles im tutorial genaus beschrieben, das mit dem unterstrich, und das man die klammern weglässt, das näxte mal lieber gucken bevor du überheblich sagst, "das kann ich für mein problem nicht brauchen..."
sonst vergeht mir die lust dir ein näxtes mal bei einem potentiellen weiteren problem noch mal helfen zu wollen, und die antworten solltest du auch genau durchlesen, das mit den klammern und dem unterstrich kam schon da hast du immer noch mit diesem komischen Ding "DbInit()" rumgemacht...mfg
murphyJa, im Nachhinein weiss ich, ich hab' einige Fehler begangen. Ich möchte mich für diese bei allen Betroffenen Entschuldigen und versuch natürlich mich aufjedenfall zu bessern!
hab' die Definition jetzt auf
typedef int (__declspec(dllimport) TDPResult)(char*, char*);
abgeändert, bringt aber keine Änderung...
Exception immernoch genau gleich...
-
Bist Du Dir eigentlich sicher, daß die Signatur
typedef int (__declspec(dllimport) TDPResult)(char*, char*);
korrekt ist? Hast Du für die Dll eine Header-Datei oder sonst irgendeine
Beschreibung?Gruß,
Alexander
-
[edit]Doppelpost
Wie kann man einen Beitrag eigentlich wieder löschen?[/edit]
-
Alexander Kempf schrieb:
Bist Du Dir eigentlich sicher, daß die Signatur
typedef int (__declspec(dllimport) TDPResult)(char*, char*);
korrekt ist? Hast Du für die Dll eine Header-Datei oder sonst irgendeine
Beschreibung?Gruß,
Alexander
ja einen header hab' ich und dort ist die Funktion so deklariert:
EXPO1 DP_RESULT EXPO2 DPInit(LPSTR pDllName, LPSTR pInitSting);
aber was LPSTR ist, hab' ich nirgends gefunden...
und ich hab ein Delphi-Beispielk das funktioniert und dort werden PChar-Variablen gesendet und dann dachte ich, char* sei schon das richtige...
Delaration in Delphi:function DPInit(pDllName, pInitSting : pchar) : TDPResult; stdcall; external 'PROF_DP.DLL';
-
Hallo,
Aus der MSDN:
LPSTR A 32-bit pointer to a character string
-
Braunstein schrieb:
Hallo,
Aus der MSDN:
LPSTR A 32-bit pointer to a character string
Oh, Vielen Dank, wusste ich nicht, die Borlandhilfe sagt nichts über LPSTR.
Jetzt hab' ich alles (Deklarationen) auf LPSTR umgebogen, die Exception kommt aber immernoch
-
roN schrieb:
Delaration in Delphi:
function DPInit(pDllName, pInitSting : pchar) : TDPResult; stdcall; external 'PROF_DP.DLL';
Hast Du auch die Deklaration von TDPResult? Es muß nämlich schon alles
stimmen.Gruß,
Alexander
-
Alexander Kempf schrieb:
Hast Du auch die Deklaration von TDPResult?
ist das die Deklaration in Delphi?
type TDPResult = ( DP_NO_ERROR, // no error DP_GENERIC_ERROR, // generic error DP_CALLED_TWICE, // DP function have been called double (only with DPSetDispatchMessage()) DP_OPEN_FAILED, // device (FDL) opening failed DP_FDL_LOAD_FAILED, // unable to load FDL library DP_NOT_OPEN, // FDL not opened DP_THREAD_ENABLED, // error, background thread enabled: function disabled DP_NO_THREAD_ENABLED, // error, background thread is not enabled: function disabled DP_OUT_OF_MEMORY, // out of memory DP_CONVERTER_FAILED, // PROFIBUS converter not found, failed or bad type DP_ILL_ADDRESS, // illegal DP slave address DP_SAP_OPEN_FAILED, // PROFIBUS SAP opening failed DP_SLAVE_OPEN, // slave is allread open DP_SLAVE_NOT_OPEN, // slave is not opened DP_SLAVE_NOT_FOUND, // slave not found DP_ILLEGAL_CONFIG, // illegal PROFIBUS configuration DP_CFG_ERROR, // sconfiguration error on startup DP_PRM_ERROR, // parameter error on startup DP_CFG_AND_PRM_ERROR, // configuration and parameter error on startup DP_BAD_LENGTH, // data length incorrect DP_INCOMPLETE, // background operation initiated: use DPGetAsyncResult() for answer. High word holds operation ID */ DP_NORESULT // no background operation finished DPGetAsyncResult() );
-
roN schrieb:
ist das die Deklaration in Delphi?
Sieht für mich nicht so aus. Vielleicht solltest Du das auch mal
in Deinen Code einbinden und als Rückgabetyp für Deine Funktion
verwenden.Gruß,
Alexander
-
Alexander Kempf schrieb:
Vielleicht solltest Du das auch mal
in Deinen Code einbinden und als Rückgabetyp für Deine Funktion
verwenden.Und wie bieg' ich das auf C++ um?
-
roN schrieb:
Und wie bieg' ich das auf C++ um?
Per Copy&Paste
-
Alexander Kempf schrieb:
Per Copy&Paste
Jetzt hab' ich das so in den header unter public eingefügt, und der Compiler meint,"Typname erwartet"
also mit copy &paste funktioniert das nicht einfach (oder ich hab's am falschen Ort eingefügt...)type TDPResult = ( DP_NO_ERROR, // no error DP_GENERIC_ERROR, // generic error DP_CALLED_TWICE, // DP function have been called double (only with DPSetDispatchMessage()) DP_OPEN_FAILED, // device (FDL) opening failed DP_FDL_LOAD_FAILED, // unable to load FDL library DP_NOT_OPEN, // FDL not opened DP_THREAD_ENABLED, // error, background thread enabled: function disabled DP_NO_THREAD_ENABLED, // error, background thread is not enabled: function disabled DP_OUT_OF_MEMORY, // out of memory DP_CONVERTER_FAILED, // PROFIBUS converter not found, failed or bad type DP_ILL_ADDRESS, // illegal DP slave address DP_SAP_OPEN_FAILED, // PROFIBUS SAP opening failed DP_SLAVE_OPEN, // slave is allread open DP_SLAVE_NOT_OPEN, // slave is not opened DP_SLAVE_NOT_FOUND, // slave not found DP_ILLEGAL_CONFIG, // illegal PROFIBUS configuration DP_CFG_ERROR, // sconfiguration error on startup DP_PRM_ERROR, // parameter error on startup DP_CFG_AND_PRM_ERROR, // configuration and parameter error on startup DP_BAD_LENGTH, // data length incorrect DP_INCOMPLETE, // background operation initiated: use DPGetAsyncResult() for answer. High word holds operation ID */ DP_NORESULT // no background operation finished DPGetAsyncResult() );
-
Hast Du Recht. Probier's mal mit enum anstatt type
und definiere mal zusätzlich noch einen typ, z.B. so:enum EnTDPResult = ( //... ); typedef EnTDPResult TDPResult;
Bin mir aber auch nicht 100% sicher und hab's auch nicht
ausprobiert.Gruß,
Alexander
-
Wenn ich das so mache:
enum EnTDPResult = ( DP_NO_ERROR, // no error DP_GENERIC_ERROR, // generic error DP_CALLED_TWICE, // DP function have been called double (only with DPSetDispatchMessage()) DP_OPEN_FAILED, // device (FDL) opening failed DP_FDL_LOAD_FAILED, // unable to load FDL library DP_NOT_OPEN, // FDL not opened DP_THREAD_ENABLED, // error, background thread enabled: function disabled DP_NO_THREAD_ENABLED, // error, background thread is not enabled: function disabled DP_OUT_OF_MEMORY, // out of memory DP_CONVERTER_FAILED, // PROFIBUS converter not found, failed or bad type DP_ILL_ADDRESS, // illegal DP slave address DP_SAP_OPEN_FAILED, // PROFIBUS SAP opening failed DP_SLAVE_OPEN, // slave is allread open DP_SLAVE_NOT_OPEN, // slave is not opened DP_SLAVE_NOT_FOUND, // slave not found DP_ILLEGAL_CONFIG, // illegal PROFIBUS configuration DP_CFG_ERROR, // sconfiguration error on startup DP_PRM_ERROR, // parameter error on startup DP_CFG_AND_PRM_ERROR, // configuration and parameter error on startup DP_BAD_LENGTH, // data length incorrect DP_INCOMPLETE, // background operation initiated: use DPGetAsyncResult() for answer. High word holds operation ID */ DP_NORESULT // no background operation finished DPGetAsyncResult() ); typedef EnTDPResult TDPResult;
sagt der Compiler
[C++ Fehler] TProfibus.h(13): E2447 'EnTDPResult' muß ein bereits definiertes enum sein.[edit] sorry, hab' EnTDPResult geschrieben, eigentlich...[/edit]
-
Das typedef brauchst du doch gar nicht. Mit dem enum ist doch schon alles deklariert. Mal abgesehen davon, hab ich mal irgendwo gelesen, dass der Rückgabetyp einer Funktion nicht zur Signatur gehört.
-
roN schrieb:
Wenn ich das so mache:
enum TDPResult = ( // ... ); typedef EnTDPResult TDPResult;
sagt der Compiler
[C++ Fehler] TProfibus.h(13): E2447 'EnTDPResult' muß ein bereits definiertes enum sein.Dann sieh Dir noch mal genau an, was ich geschrieben habe.
Das ist doch ein kommerzielle Dll, oder? Gibt's denn da von Seiten des Herstellers keine
ordentliche Unterstützung, Beispiele etc.?Gruß,
Alexander
-
Alexander Kempf schrieb:
Dann sieh Dir noch mal genau an, was ich geschrieben habe.
Siehe [edit]
Alexander Kempf schrieb:
Das ist doch ein kommerzielle Dll, oder? Gibt's denn da von Seiten des Herstellers keine
ordentliche Unterstützung, Beispiele etc.?ja, ist schon eine kommerzielle Dll und ich hab' auch ein beispiel, aber das kompiliert nicht mit dem BCB5 und ist mit statischer dll-Einbindung gemacht (hab' ich auch schon probiert, dann hat's von der Herstellerseite geheissen, das funktioniere nur mit BCB6...beim 5er hab' ich immer einen Linker-Error bekommen :() ein Beispiel das ich habe, ist für Delphi, das kompiliert ohne Probleme, dann hab' ich versucht den Delphicode mit dem BCB zu kompilieren=Wieder dieser Linker-Error ärger dann hab' ich gedacht, ich probiere mal, die Funktionen dynamisch zu laden...)
-
Hast Du's, wie Braunstein vorgeschlagen hat, auch mal ohne den typedef probiert?