![]() |
Delphi-DLL mit String-Var-Parametern von VB aus aufrufen
Ahoi!
Einfache Geschichte: Ich hab eine Delphi-Prozedur:
Delphi-Quellcode:
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.
Procedure DoSomething (Var aParameter : String);
Delphi-Quellcode:
Damit ist aber der aParameter noch kein 'Var' Parameter.
Procedure DLLWrapperDoSomething (aParameter : PChar); stdCall;
Reicht dann etwa ein
Delphi-Quellcode:
Procedure DLLWrapperDoSomething (Var aParameter : PChar); stdCall;
|
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.
|
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:
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).
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; Stimmt, machen die Window-API-Routinen auch so... Danke! |
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 04:50 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