Autor |
Beitrag |
Timbo
      
Beiträge: 166
|
Verfasst: Di 18.01.11 18:23
Hallo,
ich versuche eine DLL in Delphi einzubinden, doch leider bekomme ich mit meiner Variante einen Access Error.
Leider habe ich in C nicht so viel Erfahrung, habe aber den Quellcode der DLL.
Also in der HeaderDatei steht:
C#-Quelltext 1: 2: 3: 4: 5:
| #if _USRDLL MYDWORD __declspec(dllexport)ReceiveData(MYTCHAR*, MYTCHAR*, MYTCHAR*); #else MYDWORD __declspec(dllimport)ReceiveData(MYTCHAR*, MYTCHAR*, MYTCHAR*); #endif |
in der CPP Datei:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| DWORD CBDD6App::Dll_Receive(TCHAR* ptcWeight, TCHAR* ptcUnitP, TCHAR* ptcSaleP) { DWORD dwResult; dwResult = D6StateMachine((CString)_T("\x04\x05")); if(dwResult) return dwResult; #ifdef _UNICODE wcscpy(ptcWeight, m_strWeight); wcscpy(ptcUnitP, m_strUnitPrice); wcscpy(ptcSaleP, m_strSallingPrice); #else strcpy(ptcWeight, m_strWeight); strcpy(ptcUnitP, m_strUnitPrice); strcpy(ptcSaleP, m_strSallingPrice); #endif
return dwResult; }
extern "C" MYDWORD ReceiveData(MYTCHAR *ptcWeight, MYTCHAR *ptcUnitP, MYTCHAR *ptcSaleP) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return theApp.Dll_Receive(ptcWeight, ptcUnitP, ptcSaleP); } |
Ich habe versucht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function ReceiveData (var Gewicht,GrundPreis,VerkaufsPreis: AnsiChar): Longword; cdecl; external 'input.dll';
...
function getValue: Integer; var WCGewicht, WCGrundPreis, WCVerkauspreis: AnsiChar; begin result:= ReceiveData(WCGewicht,WCGrundPreis,WCVerkauspreis); .... end; |
Anstatt AnsiChar habe ich auch schon WideChar und String ausprobiert...
Aber immer wieder AccessError.
Ich weiß nicht mehr weiter.
Edit: Achso andere Funktionen aus der DLL funktionieren wunderbar. Allerdings haben die auch keine Rückgabe auf Parameterebene... Also da muss irgendwo der Hund begraben sein
Viele vielen Dank
Tim
Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 18.01.2011 um 17:55
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 18.01.11 19:52
Das sind Pointer auf TChars und keine Chars als Werte.
Ob es dann PAnsiChar oder PWideChar in Delphi ist, kommt darauf an wie die C++-DLL kompiliert wurde (ohne oder mit Unicode). Denn danach wird der Typ TCHAR definiert.
Ja, und dann musst du natürlich auch vorher Speicher reservieren bevor du den Puffer an die DLL übergibst, wenn die DLL da was reinschreibt. (Jedenfalls sollte es so sein, hier sieht die Funktion dafür aber seltsam aus. Da hat wohl der Ersteller der DLL nicht sauber gearbeitet.  Oder es gibt dafür andere Funktionen. Oder die Puffergröße ist fest.)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 18.01.11 20:25
Ich kenne mich mit C++ auch nicht so aus, aber ist das nicht eine Methode einer Klasse:
C#-Quelltext 1:
| DWORD CBDD6App::Dll_Receive |
Wenn dem so ist, hat der Programmierer eine Klasse in eine DLL gepackt. Und ich glaube, dann kann man nicht mit einer anderen Programmiersprache auf die exportierten Funktionen aufrufen.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 18.01.11 20:42
|
|
Timbo 
      
Beiträge: 166
|
Verfasst: Mi 19.01.11 12:52
Vielen Dank Euch allen für die schnellen Anworten!!!
Die Breite ist tatsächlich immer gleich... daher kann ich
TCharArr= array[1..6] of Char;
benutzen, funktioniert wunderbar.
Vielen Dank nochmal.
PS: Habe noch eine letzte Funktion in der DLL, die nicht richtig will...
www.delphi-forum.de/viewtopic.php?p=629976
|
|
|