Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Strings innerhalb der DLL verändern (C-DLL) (https://www.delphipraxis.net/44049-strings-innerhalb-der-dll-veraendern-c-dll.html)

weltaran 12. Apr 2005 16:21


Strings innerhalb der DLL verändern (C-DLL)
 
Hallo Leute!

Ich schreibe gerade eine DLL. Die DLL sollte möglichst universell sein, d.h. auch von Code aufgerufen werden können, welcher in anderen Sprachen geschrieben wurde.

Ich möchte in meiner DLL eine Zeichenkette, welche als Parameter übergeben wurde verändern und an das aufrufende Programm zurückgeben (es handelt sich um Unicode-Strings was aber im Moment (noch) gar nicht das Problem ist).

Eine in C geschriebene Funktion würde also so aussehen:

int myFunction(unsigned short[] text, int laenge);

Jetzt die Frage: wie lautet das entsprechende Äquivalent in Delphi!

(ein verzweifeltes) Ciao

Dax 12. Apr 2005 16:24

Re: Strings innerhalb der DLL verändern (C-DLL)
 
Dein Funktionskopf dürfte etwa so aussehen:
Delphi-Quellcode:
function myFunction(text: Array of Word; laenge: Integer); stdcall; {oder: } cdecl;

weltaran 12. Apr 2005 16:33

Re: Strings innerhalb der DLL verändern (C-DLL)
 
OK, und mit welcher Funktion kann ich in das Array schreiben? Oder muss ich mit 'ner for Schleife arbeiten?

brechi 12. Apr 2005 16:59

Re: Strings innerhalb der DLL verändern (C-DLL)
 
Warum schreibst due die funktion nicht einfach in C wenn du das besser kannst. Du brauchst doch dann nur für alle Delphi Programmierer den Header angeben (fehlt übrigens der Ergebnistyp in dem Beispiel von Dax)

Ausserdem frage ich mich warum du nicht den üblichen PWideChar verwendest?

Der Aufruf sollte "stdcall".

NicoDE 12. Apr 2005 18:45

Re: Strings innerhalb der DLL verändern (C-DLL)
 
Zitat:

Zitat von weltaran
Eine in C geschriebene Funktion würde also so aussehen:

int myFunction(unsigned short[] text, int laenge);

+ 'int' ist plattformspezifisch (Delphi: Integer), long wäre für die Übersetzung eindeutiger (Delphi: LongInt).
+ Array als Parameter sind compiler-spezifisch. Besser wäre ein(e) typiserte(r) Pointer/Referenz (wchar_t*).
+ Es fehlt die Aufrufconvention (__stdcall empfohlen).
Delphi-Quellcode:
function myFunction(text: PWideChar; laenge: Integer): Integer; stdcall;

weltaran 20. Apr 2005 10:40

Re: Strings innerhalb der DLL verändern (C-DLL)
 
Hi!

Ich hab jetzt folgende Funktion:

Delphi-Quellcode:

function retStr2(myStrSize: smallint; myChar: PWideChar): smallint;
var
     I: Integer;
        temp: widestring;
begin
     I := 0;
        temp:= 'Hallo Leute!';

     for I := 0 to 11 do
     begin
            myChar[I] := temp[i];
     end;
     myChar[12] := #0;

        result:= 42;
end;

Das aufrufende Programm habe ich so konfiguriert, dass es eine Funktion mit folgendem Aufruf erwartet:

Code:
short retStr2(short myStrSize, wchar_t myStr[1024])
Dennoch bekomme ich nichts zurück! Hat jemand eine Idee!

Ciao

NicoDE 20. Apr 2005 14:44

Re: Strings innerhalb der DLL verändern (C-DLL)
 
Wie wäre es mit...
Delphi-Quellcode:
function RetStr2(Len: Longint; Str: PWideChar): Longint; stdcall;
begin
  lstrcpynW(Str, 'Hello, World!', Len);
  Result := 42;
end;
Code:
signed long __stdcall RetStr2( signed long Len, wchar_t * Str )

weltaran 20. Apr 2005 16:07

Re: Strings innerhalb der DLL verändern (C-DLL)
 
Wo hast die diese Funktion (lstrcpynW) ausgegraben. Ist mir gänzlich unbekannt (OK, das will nichts heißen) UND ich find sie in meinem Delphi nicht.


Vorläufig habe ich die Sache folgendermaßen gelöst:

Delphi-Quellcode:

function stringrepl(var myStr: Array of WideChar; myStrSize: smallint): smallint;
var
   temp: widestring;

begin
     temp:= 'Hallo Welt!';
     StrToArray(myStr, temp);

     result:= 42;
end;


procedure StrToArray(var myArr: Array of WideChar; myStr: WideString);
var
   iArrSize, iStringSize, i: integer;

begin
     iArrSize:= Length(myArr)-1;
     iStringSize:= Length(myStr);

     for i:= 0  to Min(iArrSize, iStringSize) -1 do
     begin
          myArr[i]:= WideChar(myStr[i+1]);
     end;
     
     myArr[Min(iArrSize, iStringSize)]:= WideChar(#0);
end;

Da ich diese Übergabe öfters brauche hab ich sie in ne Funktion ausgelagert. Meine Aufrufende Anwendung kommt nur mit wchar_t myStr[xx] zurecht.



Ciao

NicoDE 20. Apr 2005 16:51

Re: Strings innerhalb der DLL verändern (C-DLL)
 
Zitat:

Zitat von weltaran
Delphi-Quellcode:
function stringrepl(var myStr: Array of WideChar; myStrSize: smallint): smallint;

Durch die Vertauschung der Parameter ist das Problem nur verschoben, denn:
Code:
function stringrepl(var myStr: Array of WideChar; myStrSize: smallint): smallint;
...ist impliziet...
Code:
function stringrepl(var myStr: Array of WideChar; myStrSize: smallint): smallint; [color=red]register;[/color]
Da es diese Aufrufkonvention in den wenigsten C-Compilern gibt (Borland's __fastcall), sollte eigentlich so aussehen:
Code:
function stringrepl([color=green]myStrSize: smallint; var myStr: Array of WideChar[/color]): smallint; [color=green]cdecl;[/color]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 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