Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C Funktion, um zwei Strings zu verbinden in DLL (https://www.delphipraxis.net/75245-c-funktion-um-zwei-strings-zu-verbinden-dll.html)

Flocke 16. Aug 2006 15:18

Re: C Funktion, um zwei Strings zu verbinden in DLL
 
Zitat:

Zitat von Luckie
Wie machen das API-Funktionen, dass man da in Delphi das Schlüsselwort var benutzen muss.

Zur Ergänzung zu Dax: das geht natürlich nicht mit Strings, da C einen anderen Speichermanager verwendet.

Zitat:

Zitat von Luckie
Wie sicher ist die C-Funktion bezüglich BufferOverflows?

Überhaupt nicht. Bessere Variante:
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:

Zitat von Luckie
Und zu guter letzt, wie muss ich es machen, damit meine C-Funktion die erforderliche Größe des Buffers zurückgibt, falls dieser zu klein ist beim Aufruf?

Ganz einfach: strlen(str1) + strlen(str2) mit buflen vergleichen und entsprechend handeln.

// EDIT: Parameterreihenfolge korrigiert

NicoDE 16. Aug 2006 15:27

Re: C Funktion, um zwei Strings zu verbinden in DLL
 
Zitat:

Zitat von Luckie
LIBRARY FirstDLL.dll

Kannst du dir sparen, du brauchts nur die EXPORTS :)
Zitat:

Zitat von Luckie
Wie machen das API-Funktionen, dass man da in Delphi das Schlüsselwort var benutzen muss.

Code:
void Foo(DWORD * Bar)
oder
void Foo(PDWORD Bar)
Lässt sich so (1)
Delphi-Quellcode:
procedure Foo(Bar: PDWORD)
so (2)
Delphi-Quellcode:
procedure Foo(const Bar: DWORD)
so (3)
Delphi-Quellcode:
procedure Foo(var Bar: DWORD)
oder so (4)
Delphi-Quellcode:
procedure Foo(out Bar: DWORD)
übersetzen.
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 von Luckie
Wie sicher ist die C-Funktion bezüglich BufferOverflows?

Die von dir verwendeten, gar nicht.
Zitat:

Zitat von Luckie
Und zu guter letzt, wie muss ich es machen, damit meine C-Funktion die erforderliche Größe des Buffers zurückgibt, falls dieser zu klein ist beim Aufruf?

Ausrechnen?
(woher soll deine C-Funktion die Größe wissen, sie wird nicht übergeben)

Luckie 16. Aug 2006 16:54

Re: C Funktion, um zwei Strings zu verbinden in DLL
 
So, ich habe die Funktion jett noch etwas erweitert:
Code:
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);
   }
}
Allerdings bekomme ich jetzt eine AV beim ersten Aufruf:
Delphi-Quellcode:
   @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
It also auch noch nicht so ganz das ware. :gruebel:

Flocke 16. Aug 2006 17:04

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.

Luckie 16. Aug 2006 20:50

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.

Flocke 16. Aug 2006 22:50

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.

Luckie 16. Aug 2006 23:34

Re: C Funktion, um zwei Strings zu verbinden in DLL
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hänge das Projekt mal an.

Dax 17. Aug 2006 00:00

Re: C Funktion, um zwei Strings zu verbinden in DLL
 
Deswegen crashts:
Code:
if(strlen(str1) + strlen(str2) < lenbuffer)
Du musst den Vergelich umdrehen.

Luckie 17. Aug 2006 00:02

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.

Dax 17. Aug 2006 00:06

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.
Seite 2 von 3     12 3      

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