Autor |
Beitrag |
Lemmy
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Mo 05.09.05 19:55
Hallo,
ich habe hier ne C-DLL die ich in Delphi einbinden will. Folgende Funktion macht aber Probleme:
Quelltext 1: 2: 3:
| bool WINAPI calcBau (HED hInstanz, const char * pszZone, const char * pszBaut, const char * pszHeiz, const char * pszRand); |
Meine Übersetzung:
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 Christian S.: Code- durch Delphi-Tags ersetzt
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Di 06.09.05 07:54
Hi,
so:
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 Tino: 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
|
Verfasst: Di 06.09.05 08:12
GetMem. 
|
|
Lemmy 
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Di 06.09.05 08:17
Hi,
auch mit
Delphi-Quelltext 1: 2:
| GetMem(pHeiz,length(aHeiz)); pHeiz:=PCHar(aHeiz); |
immer noch der selbe Fehler....
Lemmy
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 06.09.05 08:20
Lädst du die DLL statisch oder dynamisch? Zeig mal alles.
|
|
Lemmy 
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Di 06.09.05 08:33
statisch:
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
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var aLizenz, aNehmer:String; pKennung, pVersion, pLizenznehmer:array [0..255] of 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 
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: 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...
Quelltext 1:
| bool WINAPI eGetE(HEID hInstanz, char** ppszBResults, char** ppszAResults); |
Noch ne Frage: WEnn ich
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
      
Beiträge: 849
|
Verfasst: 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 
      
Beiträge: 792
Erhaltene Danke: 49
Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
|
Verfasst: Di 06.09.05 10:31
Hi,
auch mit Bool tut sich nix.
Lemmy
|
|
|