![]() |
Re: C Funktion, um zwei Strings zu verbinden in DLL
Zitat:
Zitat:
Code:
extern "C" EXPORT int addstr(char *str1, char *str2, char *buffer, int buflen)
{ StringCbCopy(buffer, buflen, str1); StringCbCat(buffer, buflen, str2); return strlen(buffer); } Zitat:
// EDIT: Parameterreihenfolge korrigiert |
Re: C Funktion, um zwei Strings zu verbinden in DLL
Zitat:
Zitat:
Code:
Lässt sich so (1)
void Foo(DWORD * Bar)
oder void Foo(PDWORD Bar)
Delphi-Quellcode:
so (2)
procedure Foo(Bar: PDWORD)
Delphi-Quellcode:
so (3)
procedure Foo(const Bar: DWORD)
Delphi-Quellcode:
oder so (4)
procedure Foo(var Bar: DWORD)
Delphi-Quellcode:
übersetzen.
procedure Foo(out Bar: DWORD)
Die Entscheidung hängt davon ab, ob Bar nil sein darf (1) oder nicht (2-4). Im letzteren Falle zwingt man den Delphi-Entwickler eine DWORD-Variable (bzw. impliziet deren Adresse) zu übergeben. Zitat:
Zitat:
(woher soll deine C-Funktion die Größe wissen, sie wird nicht übergeben) |
Re: C Funktion, um zwei Strings zu verbinden in DLL
So, ich habe die Funktion jett noch etwas erweitert:
Code:
Allerdings bekomme ich jetzt eine AV beim ersten Aufruf:
EXPORT int addstr(char *str1, char *str2, char *buffer, int lenbuffer)
{ if(strlen(str1) + strlen(str2) < lenbuffer) { return strlen(str1) + strlen(str2); } else { strcpy(buffer, str1); strcat(buffer, str2); return strlen(buffer); } }
Delphi-Quellcode:
It also auch noch nicht so ganz das ware. :gruebel:
@AddStr := GetProcAddress(hLib, 'addstr');
if Assigned(AddStr) then begin str1 := 'Hello '; str2 := 'World'; len := AddStr(PChar(str1), PChar(str2), nil, 0); GetMem(Buffer, len); try len := AddStr(PChar(str1), PChar(str2), Buffer, sizeof(Buffer)); ShowMessage(string(Buffer) + '[' + IntToStr(len) + ']'); finally FreeMem(Buffer); end; end |
Re: C Funktion, um zwei Strings zu verbinden in DLL
Ist auch noch nicht ganz richtig, der Puffer braucht ein Zeichen mehr (abschließende Null), also: strlen(str1) + strlen(str2) + 1.
|
Re: C Funktion, um zwei Strings zu verbinden in DLL
OK, das erklärt aber nicht, warum es beim ersten Aufruf crasht, wenn ich als Buffer nil übergebe.
|
Re: C Funktion, um zwei Strings zu verbinden in DLL
Dann hab' ich dich nicht richtig verstanden. Ist der Funktionszeiger den korrekt? Kannst du im CPU-Fenster in die Routine hineindebuggen? Vielleicht siehst du da, wo der Fehler auftritt.
|
Re: C Funktion, um zwei Strings zu verbinden in DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hänge das Projekt mal an.
|
Re: C Funktion, um zwei Strings zu verbinden in DLL
Deswegen crashts:
Code:
Du musst den Vergelich umdrehen.
if(strlen(str1) + strlen(str2) < lenbuffer)
|
Re: C Funktion, um zwei Strings zu verbinden in DLL
Warum das? :gruebel:
Nein, ändert auch nichts. Crasht immer noch. Ich habe eher das gefühl, er mag den Nullzeiger nicht. |
Re: C Funktion, um zwei Strings zu verbinden in DLL
Weil du kopierst, wenn der Buffer kürzer ist als beide Strings zusammen, und 0 ist definitiv kürzer als 11. Dann kopierst du auf PChar(0) und hast den Salat..
@edit: versteh ich nicht :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz