vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2021
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
VB6-String an externes Programm per COM übergeben 
Autor: MisterCP
Datum: 06.01.21 09:19

Hallo,

ich bin gerade dabei ein VB6-Programm neu in VB.Net zu verfassen.

Dabei bestehet die Aufgabe, einen String an ein externes C#-Programm per COM zu übergeben.
Das Lesen über die Schnittstelle (c# => VB.Net) funktioniert, aber ich kann keinen String an das C#-Programm senden.

im VB6-Programm konnte ich einfach folgendes machen: (die Zahlen sind Zieladressen)
Dim txt as String
txt = "irgendwas"
AISExport.sExp(49, 2, AisErr) = txt
unter VB.Net erhalte ich den Fehler: Typenkonflikt. (Ausnahme von HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH)

Ich habe auch schon probiert, den String als ByteArray zu übergeben, ändert am Ergbenis leider nichts.

Dim txt() As Byte
txt = System.Text.Encoding.UTF8.GetBytes("kjtgfzutrf")
AISExport.sExp(49, 2, AisErr) = txt
Habt ihr noch einen Tip, wie ich den String übergeben könnte?

Vielen Dank schon mal
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: effeff
Datum: 06.01.21 21:50

Den Typen solltest Du doch aus dem Objekt "AISExport" herausfinden können. Wenn es ein String ist, warum willst Du die Daten dann als Byte übergeben?

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: MisterCP
Datum: 06.01.21 22:23

Hallo effeff,

ich habe von dem Programm nur eine Beschreibung in Form einer Hilfedatei. Nach dieser Hilfe hatte ich damals das VB6-Programm geschrieben und das alte Programm funktioniert auch nach wie vor unter Win10.

in der Doku steht:
[id(8), propput] void sExp(long hExp, long nExp, long* nErr, BSTR lpszNewValue);
[id(10), propput] void sExpLgu(long hExp, long nExp, long nLgu, long* nErr, _
  BSTR lpszNewValue);
bzw. (für VB6!)
Private Sub TestButton_Click()
    Dim Export As Object
    Set Export = CreateObject("AisAnl.ExpCom")
 
    Dim hExp As Long
    hExp = Export.hExp("SysParAna")
 
    If hExp > 0 Then
        Dim sExp As String
        Dim nErr As Long
 
        'Erste Zeile Exporttext lesen
        sExp = Export.sExp(hExp, 1, nErr)
        Debug.Print "1. Exportwert: ", sExp
        'Ausgabe: 1. Exportwert: Maximale Schubzeit   [min]
 
        If nErr = 0 Then
            'Erste Zeile Exporttext schreiben
            Export.sExp(hExp, 1, nErr) = "Neue Bezeichnung"
            Debug.Print "1. Exportwert: ", Export.sExp(hExp, 1, nErr)
nach Anpassung der früheren Long-Variablen durch Int32 funktioniert es bis einschließlich Lesen.
nur das Schreiben eben nicht mehr.

aber auch
Dim pTxt As System.IntPtr
pTxt = System.Runtime.InteropServices.Marshal.StringToBSTR("zujitfzutf")
AISExport.sExp(49, 2, AisErr) = pTxt
bringt nach wie vor den gleichen Fehler.

Früher unter VB6 konnte ich einfach einen String zurückschreiben und gut, aber VB.Net macht da irgendwas anders.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: Manfred X
Datum: 07.01.21 07:22

Hallo!

Schau mal hier:
https://docs.microsoft.com/de-de/dotnet/framework/interop/default-marshaling-for-strings
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: MisterCP
Datum: 07.01.21 18:36

Hallo Manfred,

der Tip sieht vielversprechend aus, aber leider stelle ich mich zu doof an, damit eine Variable zu deklarieren. Würdest du mir bei der Syntax (oder Vorgehensweise) der Deklaration helfen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: Manfred X
Datum: 08.01.21 07:24

Hallo!

Mich irritiert, dass es sich um ein C#-Programm handelt, mit dem
Du kommunizieren willst. Es sollte möglich sein, z.B. per Stringbuilder-Variable
Zeichenfolgen direkt (ohne Angaben zum Marshalling) zu übertragen.
VB.Net und C# operieren auf der gleichen Framework-Plattform.
Aus diesem Grund hast Du es mit verwalteten Datentypen zu tun.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: MisterCP
Datum: 08.01.21 07:36

Hallo Manfred,

nun bewege ich mich in noch größerer Entfernung von vorhandener Ahnung.

in den Dateieigenschaften steht was von MFC-Anwendung. Und wenn ich das in der Suchmaschine eingebe, spricht er von C++, was anscheinend wieder deutliche Unterschiede zu C# hat. Sorry das war mir vorher nicht klar.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: Manfred X
Datum: 08.01.21 09:50

Hallo!

Zur Orientierung:

MFC steht für "Microsoft Foundation Classes".
Das war ein Klassenmodell, die insbesondere für die damalige
Visual C++ Entwicklung eingesetzt werden konnte.
Wir befinden uns dabei in Mitte/Ende der 90er Jahre.
Das letzte Programm mit dieser Umgebung habe ich vor
ca. 18 Jahren geschrieben.

C++ ist eine völlig andere Programmiersprache als C#.

C# ist die "Basissprache" des Net-Framework und eine wesentlich
spätere Entwicklung als die Sprache C++, deren Anfänge bereits
in den 70er Jahren liegen, die später für die objekt-orientierte
Programmierung durch Klassenmodelle stark ausgebaut worden ist.

Versuche, die String-Parameter mit Variablen des Typs
System.Text.Stringbuilder zu belegen, die Du bei der Deklaration
im Konstruktor mit einer hinreichenden Zahl von Leerzeichen
versiehst. Wie viele das mindestens sein müssen, kann nur die
Dokumentation lehren oder es muss durch Probieren gefunden werden.
Vorsicht: Hier drohen eventuell Abstürze.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: VB6-String an externes Programm per COM übergeben 
Autor: MisterCP
Datum: 13.01.21 18:54

Hallo Manfred,

meine Versuche mit deinem Tip haben leider auch nichts gebracht, was aber wahrscheinlich nicht am falschen Tip lag, sondern an einer sehr merkwürdigen anderen Beobachtung.

Wärend ich aus VB6 heraus die Schnittstelle wie Eingangs beschrieben mit
Dim txt as String
txt = "irgendwas"
AISExport.sExp(49, 2, AisErr) = txt
nach wie vor erfolgreich ansprechen kann, muss ich im VB.Net-Programm
Dim txt as String
txt = "irgendwas"
AISExport.sExp(49, 2, AisErr, txt)
verwenden. Wohlgemerkt bei gleicher Version des AIS-Programms und gleicher Betriebssystemumgebung.

Mir ist völlig schleierhaft warum das so ist, aber es funktioniert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2021 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel