Autor Beitrag
Timbo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:
ausblenden 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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 18.01.2011 um 17:55
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. :gruebel: Oder es gibt dafür andere Funktionen. Oder die Puffergröße ist fest.)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 18.01.11 20:25 
Ich kenne mich mit C++ auch nicht so aus, aber ist das nicht eine Methode einer Klasse:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 18.01.11 20:42 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Ich kenne mich mit C++ auch nicht so aus, aber ist das nicht eine Methode einer Klasse:
Ja, ist es, aber das ist nicht die exportierte Funktion:
ausblenden C#-Quelltext
1:
return theApp.Dll_Receive...					
Da wird die Funktion innerhalb der DLL von der exportierten Funktion aufgerufen.
Timbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 166



BeitragVerfasst: 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