Autor Beitrag
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mo 05.09.05 19:55 
Hallo,

ich habe hier ne C-DLL die ich in Delphi einbinden will. Folgende Funktion macht aber Probleme:

ausblenden Quelltext
1:
2:
3:
bool WINAPI calcBau (HED hInstanz, const char * pszZone, 
                    const char * pszBaut, const char * pszHeiz, 
                    const char * pszRand);



Meine Übersetzung:
ausblenden Delphi-Quelltext
1:
 function CalcBau (EHandle:TEidHandle; pZone, pBaut, pHeiz, pRand:PChar):boolean; stdcall;					



Ich habe 2 Versionen der DLL, eine im Debug-Modus kompiliert, eine normal: Bei der im Debug Modus kommt eine Assertion mit der _CrtIsValidHeapPointer(pUserData).

Im "normalen" Modus kommt eine DLL-Interne Fehlermeldung nach der die Daten nicht vollständig an die DLL übertragen worden sind.


Wir stehen jetzt auf dem Schlauch! Wir haben schon versucht ein Array of Char zu übergeben und auch einen Pointer auf das Array - beides mal ist das Ding komplett abgeschmiert. Hat jemand ne Lösung für unser Problem?


Übrigends: Ich habe an die DLL schon kurze PChars übergeben können (an eine andere Funktion). Da gab es kein Problem!


Wolfgang

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 05.09.05 20:14 
Wie sieht denn der Aufruf der Übersetzung aus? Habt ihr auch Speicher für die PChar Parameter reserviert?
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Di 06.09.05 07:54 
Hi,

so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var iHandle:TEIDHandle;
    aZone, aBaut, aHeiz, aRand:String;
    pZone, pBaut, pHeiz, pRand:PChar;
begin
  aZone:='1 2 3'#13#10'3 4 5'#13#10#0;
  aBaut....

  pZone:=PCHAR(aZone);
   ...

  CalcBau(iHandle,pZone,pBaut,pHeiz,pRand);
end;


Wie zum Geier reserviere ich Platz für PChar? Ein SetLength tut nicht....

Lemmy

Nachtrag:

Ich muss neben dem CRLF oben noch ein weiteres Sonderzeichen (#9 TAB) zwischen den einzelnen Zeichen einfügen. Macht das beim PCHar Probleme?

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Zuletzt bearbeitet von Lemmy am Di 06.09.05 08:12, insgesamt 1-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 06.09.05 08:12 
GetMem. ;)
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Di 06.09.05 08:17 
Hi,

auch mit

ausblenden Delphi-Quelltext
1:
2:
    GetMem(pHeiz,length(aHeiz)); //aber auch length(aHeiz)+1
    pHeiz:=PCHar(aHeiz);


immer noch der selbe Fehler....

Lemmy
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 06.09.05 08:20 
Lädst du die DLL statisch oder dynamisch? Zeig mal alles.
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Di 06.09.05 08:33 
statisch:

ausblenden volle Höhe Delphi-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:
25:
26:
27:
28:
29:
30:
31:
32:
unit sysEModul;

interface

const aDLLFile='EnergieBeta.dll';

type TEHandle=Word;
     TArray=array of array of CHAR;
     tTestArray=array of char;
     pTestArray=^tTestArray;


  function EInit (bUseExceptions:Boolean; pLizenzschluessel, pLizenznehmer:PChar):TEHandle;  stdcall;
  function ERelease (EHandle:TEHandle):boolean;   stdcall;
  function ECalcBau (EHandle:TEHandle; pZonen, pBaut, pHeiz, pRand:PChar):boolean;   stdcall;
  function ECalcAnlage (EHandle:TEHandle; pGeb, pHeiz, pTrink, pLueft:PChar):boolean;  stdcall;
  function ECalcE (EHandle:TEHandle):boolean;   stdcall;
  function EGetE (EHandle:TEHandle; BResults, AResults:TArray):Boolean;   stdcall;
  function EGetLastErrorInformation (pFilename, pZeile, pMessage:PChar):boolean;  stdcall;
  function EGetDLLInformation (pKennung, pVersion, pLizenznehmer:PChar):Boolean;   stdcall;
  

implementation

function eInit; external aDLLFile name 'eInit';
function eRelease; external aDLLFile name 'eRelease';
function eCalcBau; external aDLLFile name 'eCalcBau';
function eCalcAnlage; external aDLLFile name 'eCalcAnlagen';
function eCalcE; external aDLLFile name 'eCalcE';
function eGetE; external aDLLFile name 'eGetE';
function eGetLastErrorInformation; external aDLLFile name 'eGetLastErrorInformation';
function eGetDLLInformation; external aDLLFile name 'eGetDLLInformation';



den Aufruf der Funktion kennst Du ja schon. Vorher initialisiere ich die DLL mit

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var aLizenz, aNehmer:String;
    pKennung, pVersion, pLizenznehmer:array [0..255of char;
begin  
  aLizenz:='xxx';
  aNehmer:='xxx';
  iHandle:=EInit(false,PChar(aLizenz),PChar(aNehmer));
  EGetDLLInformation(pKennung,pVersion,pLizenznehmer);


ich bekomme ein gültiges Handle und die korrekte Versionsnummer/Lizenznehmer zurück.
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Di 06.09.05 09:41 
sodele, der Fehler lag im TEHandle, das Ding muss vom Typ LongWord sein, dann tut die Funktion. Jetzt habe ich aber mit der Funktion GetCalcE ein Problem: Was ist CHAR** für ein Datentyp in Delphi? Ein mehrdimesionales Char array tut nicht, PCHar tut auch nicht...

ausblenden Quelltext
1:
  bool WINAPI eGetE(HEID hInstanz, char** ppszBResults, char** ppszAResults);					



Noch ne Frage: WEnn ich

ausblenden Delphi-Quelltext
1:
  if EGetDLLInformation(pKennung,pVersion,pLizenznehmer) then begin					


aufrufe ist der Funktionswert false - in den Übergabeparametern stehen aber die korrekten Werte drin. Die Bools sind doch in Delphi / C ähnlich...

Lemmy
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 06.09.05 09:53 
Nimm statt Boolean, BOOL. Ein Delphi Boolean ist nur ein Byte groß. BOOL aber vier Bytes.

_________________
Ciao, Sprint.
Lemmy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Di 06.09.05 10:31 
Hi,

auch mit Bool tut sich nix.


Lemmy