AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein C Funktion, um zwei Strings zu verbinden in DLL
Thema durchsuchen
Ansicht
Themen-Optionen

C Funktion, um zwei Strings zu verbinden in DLL

Ein Thema von Luckie · begonnen am 16. Aug 2006 · letzter Beitrag vom 17. Aug 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

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

  Alt 16. Aug 2006, 16:18
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 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 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
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#12

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

  Alt 16. Aug 2006, 16:27
Zitat von Luckie:
LIBRARY FirstDLL.dll
Kannst du dir sparen, du brauchts nur die EXPORTS
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)procedure Foo(Bar: PDWORD) so (2)procedure Foo(const Bar: DWORD) so (3)procedure Foo(var Bar: DWORD) oder so (4)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 von Luckie:
Wie sicher ist die C-Funktion bezüglich BufferOverflows?
Die von dir verwendeten, gar nicht.
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)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

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

  Alt 16. Aug 2006, 17:54
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

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

  Alt 16. Aug 2006, 18:04
Ist auch noch nicht ganz richtig, der Puffer braucht ein Zeichen mehr (abschließende Null), also: strlen(str1) + strlen(str2) + 1.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

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

  Alt 16. Aug 2006, 21:50
OK, das erklärt aber nicht, warum es beim ersten Aufruf crasht, wenn ich als Buffer nil übergebe.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

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

  Alt 16. Aug 2006, 23:50
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

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

  Alt 17. Aug 2006, 00:34
Ich hänge das Projekt mal an.
Angehängte Dateien
Dateityp: zip firstdll_144.zip (218,4 KB, 4x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#18

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

  Alt 17. Aug 2006, 01:00
Deswegen crashts:
Code:
if(strlen(str1) + strlen(str2) < lenbuffer)
Du musst den Vergelich umdrehen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#19

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

  Alt 17. Aug 2006, 01:02
Warum das?

Nein, ändert auch nichts. Crasht immer noch. Ich habe eher das gefühl, er mag den Nullzeiger nicht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#20

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

  Alt 17. Aug 2006, 01:06
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz