![]() |
Delphi DLL in VB.net mit "String"-Rückgabe nutzen
Hallo liebe Delphi-Praxis Community,
ich bin hier noch sehr neu. Daher weiß ich nicht, ob diese Problemstellung im richtigen Bereich gelandet ist. Ich habe in Delphi eine DLL gebaut, die einen Barcode erzeugt, als Bild zeichnet und abspeichert. Die Funktion gibt den Pfad zur Bilddatei zurück. Die Dll möchte ich nun in VB.net nutzen. Der Aufruf der Funktion und Übergabe der Parameter funktioniert soweit. Nur die Rückgabe des Pfads als String ist nicht erfolgreich. Hier "stürzt" das Programm in VB.net ab. Habt ihr evtl. Tipp, wie das mit der String-Rückgabe funktionieren könnte? Oder auch einen anderen Ansatz? Über var-Parameter?(Habe ich auch schon begonnen, aber ohne Erfolg) Vielen Dank schon einmal im Voraus!! Hier meine Hauptfunktion in der Delphi DLL:
Delphi-Quellcode:
Und hier der Aufruf in VB.net
function GenerateBarcodeLVD(ident, version: PWideChar): PWideChar; stdcall;
var Input: String; Filename: String; Pfad: String; begin Input := WideCharToString(ident) + '~' + WideCharToString(version); Filename := Input; Pfad := GenerateBarcode(GenerateBINARY(Input), Filename); StringToWideChar(Pfad, Result, length(Pfad)); end; exports GenerateBarcodeLVD;
Code:
Als Fehler erscheint in VB:
Imports System
Imports System.IO Imports System.Runtime.InteropServices Public Class Form1 <DllImport("C:\temp\BarcodeGenerate.dll", EntryPoint:="GenerateBarcodeLVD", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Shared Function GenerateBarcodeLVD(ByVal ident As String, ByVal version As String) As String End Function Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim barcodeDest As String barcodeDest = GenerateBarcodeLVD("L1234567", "b-01") MsgBox(barcodeDest) End Sub End Class Unbehandelte Ausnahme: System.AccessViolationException: "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist." |
AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen
StringToWideChar kopiert nur den Inhalt eines String in einen PWideChar.
Den Speicher, auf welchen dieser PWideChar zeigt, den muß vorher aber noch irgendwer reservieren/erstellen:!: Das Result über einen (var) Parameter rausgeben und nicht als Result. Oder, verwende besser WideString, anstatt PWideChar. Im VB sollte es dafür bestimmt auch eine Kapseltung geben, also für die APIs um ![]() |
AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen
|
AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen
Vielen Dank für die schnelle Rückmeldungen. Wahnsinn wie schnell das geht!! :-D
Danke himitsu für den Tipp mit WideString!! Nun funktioniert es einwandfrei! Delphi DLL:
Delphi-Quellcode:
Und in VB.net
function GenerateBarcodeLVD(ident, version: PWideChar; out pfad: WideString): Integer; stdcall;
var Input: String; Filename: String; begin Input := WideCharToString(ident) + '~' + WideCharToString(version); Filename := Input; pfad := GenerateBarcode(GenerateBINARY(Input), Filename); Result := 0; //wird später noch verwendet -1, 0, 1,... end; exports GenerateBarcodeLVD,
Code:
<DllImport("C:\temp\BarcodeGenerate.dll", EntryPoint:="GenerateBarcodeLVD", SetLastError:=True, CharSet:=CharSet.Unicode,
ExactSpelling:=True,CallingConvention:=CallingConvention.StdCall)> Public Shared Function GenerateBarcodeLVD(ByVal ident As String, ByVal version As String, <MarshalAs(UnmanagedType.BStr)> ByRef pfad As String) As Integer End Function Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim pfad As String GenerateBarcodeLVD("L1234567", "b-01", pfad) MsgBox(pfad) End Sub |
AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen
Du denkst vielleicht es wäre richtig ist es aber nicht.
Korrekte übersetzung.
Delphi-Quellcode:
Oder deine variante wenn du den BarCode in einer Extra function mit unterschiedlicher "ident, version" ermitteln willst
function GenerateBarcodeLVD(ident, version: PWideChar; var pfad: WideString): LongBool {oder einfach BOOL}; stdcall;
begin GenerateBarcodeLVD('L1234567', 'b-01', pfad) Result := (pfad <> '') end; exports GenerateBarcodeLVD, Vorausgesetzt GenerateBarcode gibt einen WideString zurück.
Delphi-Quellcode:
oops. EDIT:
function GenerateBarcodeLVD(ident, version: PWideChar; var pfad: WideString): BOOL; stdcall;
var Input: String; Filename: String; begin Input := WideCharToString(ident) + '~' + WideCharToString(version); Filename := Input; pfad := GenerateBarcode(GenerateBINARY(Input), Filename); Result := (pfad <> '') end; exports GenerateBarcodeLVD, Sehe gerade du wolltest eine Übersetzung von Delphi nach VB.net. Dann ist aber eine Rückgabe unnötig wenn du var verwendest, wie dem auch sei.
Code:
Public Shared Sub GenerateBarcodeLVD(ByVal ident As String, ByVal version As String, <MarshalAs(UnmanagedType.BStr)> ByRef pfad As String)
End Sub |
AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen
Hallo venice2,
richtig. Die in Delphi erzeugte DDL rufe ich nur über VB auf. Und richtig, die Rückgabe ist bei dem nun verwendeten var-Parameter hinfällig. Hab es mir trotzdem offen gehalten, falls noch etwas dazu kommen sollte. Vielen Dank trotzdem für deine Hilfe!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 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