AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein .NET-Framework (managed code) Delphi Delphi DLL in VB.net mit "String"-Rückgabe nutzen

Delphi DLL in VB.net mit "String"-Rückgabe nutzen

Ein Thema von jforest · begonnen am 28. Sep 2020 · letzter Beitrag vom 29. Sep 2020
Antwort Antwort
jforest

Registriert seit: 28. Sep 2020
3 Beiträge
 
#1

Delphi DLL in VB.net mit "String"-Rückgabe nutzen

  Alt 28. Sep 2020, 14:16
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:
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;
Und hier der Aufruf in VB.net

Code:
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
Als Fehler erscheint in VB:

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."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.865 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen

  Alt 28. Sep 2020, 15:00
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 MSDN-Library durchsuchenSysAllocStringLen/SysFreeString/SysStringLen, welche der WideString im Delphi intern aufruft.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.807 Beiträge
 
Delphi XE4 Professional
 
#3

AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen

  Alt 28. Sep 2020, 15:12
Hallo,
https://stackoverflow.com/questions/...phi-dll-to-net
Heiko
  Mit Zitat antworten Zitat
jforest

Registriert seit: 28. Sep 2020
3 Beiträge
 
#4

AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen

  Alt 28. Sep 2020, 16:11
Vielen Dank für die schnelle Rückmeldungen. Wahnsinn wie schnell das geht!!

Danke himitsu für den Tipp mit WideString!!
Nun funktioniert es einwandfrei!

Delphi DLL:
Delphi-Quellcode:
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,
Und in VB.net

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
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
283 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen

  Alt 28. Sep 2020, 23:13
Du denkst vielleicht es wäre richtig ist es aber nicht.

Korrekte übersetzung.
Delphi-Quellcode:
function GenerateBarcodeLVD(ident, version: PWideChar; var pfad: WideString): LongBool {oder einfach BOOL}; stdcall;
begin
  GenerateBarcodeLVD('L1234567', 'b-01', pfad)

  Result := (pfad <> '')
end;

exports
  GenerateBarcodeLVD,
Oder deine variante wenn du den BarCode in einer Extra function mit unterschiedlicher "ident, version" ermitteln willst
Vorausgesetzt GenerateBarcode gibt einen WideString zurück.

Delphi-Quellcode:
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,
oops. EDIT:
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

Geändert von venice2 (28. Sep 2020 um 23:43 Uhr)
  Mit Zitat antworten Zitat
jforest

Registriert seit: 28. Sep 2020
3 Beiträge
 
#6

AW: Delphi DLL in VB.net mit "String"-Rückgabe nutzen

  Alt 29. Sep 2020, 07:25
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!!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf