AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Strings innerhalb der DLL verändern (C-DLL)
Thema durchsuchen
Ansicht
Themen-Optionen

Strings innerhalb der DLL verändern (C-DLL)

Ein Thema von weltaran · begonnen am 12. Apr 2005 · letzter Beitrag vom 20. Apr 2005
Antwort Antwort
Benutzerbild von weltaran
weltaran

Registriert seit: 12. Sep 2003
Ort: Offenburg
78 Beiträge
 
Delphi 5 Enterprise
 
#1

Strings innerhalb der DLL verändern (C-DLL)

  Alt 12. Apr 2005, 17:21
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
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

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

  Alt 12. Apr 2005, 17:24
Dein Funktionskopf dürfte etwa so aussehen:function myFunction(text: Array of Word; laenge: Integer); stdcall; {oder: } cdecl;
  Mit Zitat antworten Zitat
Benutzerbild von weltaran
weltaran

Registriert seit: 12. Sep 2003
Ort: Offenburg
78 Beiträge
 
Delphi 5 Enterprise
 
#3

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

  Alt 12. Apr 2005, 17:33
OK, und mit welcher Funktion kann ich in das Array schreiben? Oder muss ich mit 'ner for Schleife arbeiten?
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#4

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

  Alt 12. Apr 2005, 17:59
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".
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

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

  Alt 12. Apr 2005, 19:45
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).
function myFunction(text: PWideChar; laenge: Integer): Integer; stdcall;
  Mit Zitat antworten Zitat
Benutzerbild von weltaran
weltaran

Registriert seit: 12. Sep 2003
Ort: Offenburg
78 Beiträge
 
Delphi 5 Enterprise
 
#6

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

  Alt 20. Apr 2005, 11:40
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#7

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

  Alt 20. Apr 2005, 15:44
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 )
  Mit Zitat antworten Zitat
Benutzerbild von weltaran
weltaran

Registriert seit: 12. Sep 2003
Ort: Offenburg
78 Beiträge
 
Delphi 5 Enterprise
 
#8

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

  Alt 20. Apr 2005, 17:07
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
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#9

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

  Alt 20. Apr 2005, 17:51
Zitat von weltaran:
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]
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:17 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