![]() |
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 |
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;
|
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?
|
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". |
Re: Strings innerhalb der DLL verändern (C-DLL)
Zitat:
+ 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;
|
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:
Dennoch bekomme ich nichts zurück! Hat jemand eine Idee!
short retStr2(short myStrSize, wchar_t myStr[1024])
Ciao |
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 )
|
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 |
Re: Strings innerhalb der DLL verändern (C-DLL)
Zitat:
Code:
...ist impliziet...
function stringrepl(var myStr: Array of WideChar; myStrSize: smallint): smallint;
Code:
Da es diese Aufrufkonvention in den wenigsten C-Compilern gibt (Borland's __fastcall), sollte eigentlich so aussehen:
function stringrepl(var myStr: Array of WideChar; myStrSize: smallint): smallint; [color=red]register;[/color]
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 21:59 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