Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi-DLL mit String-Var-Parametern von VB aus aufrufen (https://www.delphipraxis.net/63729-delphi-dll-mit-string-var-parametern-von-vbulletin-aus-aufrufen.html)

alzaimar 22. Feb 2006 10:32


Delphi-DLL mit String-Var-Parametern von VB aus aufrufen
 
Ahoi!

Einfache Geschichte: Ich hab eine Delphi-Prozedur:
Delphi-Quellcode:
Procedure DoSomething (Var aParameter : String);
Darum eine DLL und so deklarieren, das sie von VB aus ansprechbar ist. Nun hab ich kein VB, sonst würd ich da schon was finden, denn ich weiss schon, das ich den String als PChar und die Prozedur als stdCall deklarieren muss.

Delphi-Quellcode:
Procedure DLLWrapperDoSomething (aParameter : PChar); stdCall;
Damit ist aber der aParameter noch kein 'Var' Parameter.

Reicht dann etwa ein
Delphi-Quellcode:
Procedure DLLWrapperDoSomething (Var aParameter : PChar); stdCall;

SirThornberry 22. Feb 2006 10:38

Re: Delphi-DLL mit String-Var-Parametern von VB aus aufrufen
 
dadurch das es ein PChar ist, ist es so als würdest du einen String als Var übergeben. Durch das Var wird ja nix anderes erreicht als das die Adresse der Variablen übergeben wird (anstelle die Variable zu kopieren). Und wenn du einen PChar hast ist das ein Pointer auf Zeischen. Das heißt du kannst wild auf dem rumschreiben worauf der PChar zeigt. Allerdings solltest du dabei beachten das der Speicher wo der PChar drauf zeigt auch groß genug ist.

alzaimar 22. Feb 2006 10:43

Re: Delphi-DLL mit String-Var-Parametern von VB aus aufrufen
 
Hi Sir, danke für die schnelle Anwort.

Genau das ist glaube ich, mein Problem.

Ich deklariere also so was;
Delphi-Quellcode:
Libary MyDLL;
...
Procedure DLLWrapperDoSomething (aString : PChar);
Var
  s : String;

Begin
  s := String (aString);
  DoSomeThing (s);
  aString := PChar (s); // Hint/Warnung 'Zugewiesener Wert wird nicht verwendet' is ja auch logisch
End;
Reicht es, wenn man dem Aufrufer (also dem VB-Coder) sagt, das er seinen String gefälligst groß genug dimensionieren muss? Dann würde ich den PChar, wie Du sagtest, als Pointer auffassen, den veränderten String ('s') einfach da rein schreiben und die o.g. Deklaration verwenden (also ohne VAR).

Stimmt, machen die Window-API-Routinen auch so...

Danke!

SirThornberry 22. Feb 2006 12:32

Re: Delphi-DLL mit String-Var-Parametern von VB aus aufrufen
 
genau, sie windows-api-routinen machen das auch so.
Wenn du es wie die Windowsapi machen willst wäre es das sinnvollste das du einen weiteren Parameter hinzufügst der angibt wieviel speicher zur Verfügung steht (und falls dieser nicht reicht machst du eben nix). Desweiteren würde ich das ganze zu einer funktion umformen die zurück gibt wieviel zeichen in den PChar geschrieben wurden bzw. wie groß der Speicher sein müsste.
Wenn du also 2 Zeischen auf den PChar copieren willst solltest du als Rückgabewert eine 20 setzen. Wenn dann jemand die funktion aufruft mit zu wenig speicher (10 byte) so weiß er durch die Rückgabe der 20 das er das ganze nochmal aufrufen muss mit einer Speichergröße von 20.
Oder im umgekehrten Fall. Es ruft jemand die Funktion auf mit einer Speichergröße von 30. Durch die Rückgabe der 20 weiß der Aufrufer das er nur die ersten 20 zeischen nutzen sollte und der Rest Datenmüll ist.


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