Gå til innhold

Kalle VB6 DLLer fra Vb.Net og C#.Net


Anbefalte innlegg

Hei, hvordan får jeg til å kalle VB 6 DLLer fra VB.NET?

 

Her er VB6 koden min,

Public Function Yea(ByVal test As String)
test = test + " hehe, det funker!"
MsgBox (test)
End Function

 

Og her er VB.Net 05 koden min,

Imports System.Runtime.InteropServices


Module Module1
<DllImport("C:\myDLL.dll", EntryPoint:="Yea", SetLastError:=True, _
CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Function Yea( _
ByVal test As String)
	' Leave the body of the function empty.
End Function

Sub Main()
	Yea("LOL")
End Sub

End Module

 

Men får feilmeldingen

PInvoke restriction: cannot return variants.

 

Og av tidligere fikk jeg noe om at den ikke fant 'EntryPoint named' osv, vet ikke hva som er "nærmest" av PInvoke og EnteryPoint jeg.

 

Gi gjerne eksempel kode som bruker DLLen (Se lenger opp, VB6) sin kode.

Lenke til kommentar
Videoannonse
Annonse

Den der yea-funksjonen må i vb6 ligge i en class-module i et active dll prosjekt. Hvis prosjektet heter ole og modulen doffen, da blir referansen til yea i vb.net som dette:

dim m as new ole.doffen, x as string
x = m.yea("Drittsekk")

men husk at ole.dll først må registreres med regsvr32 før man kan gjøre Add Reference og trykk på COM i vb.net prosjektet.

Lenke til kommentar

Jeg kjenner svert lite til VB6, men jeg bruker Clarion en del og den er heller ikke noe typpisk kjent for å snakke med Windows. Men når jeg eksporterer prosedyrer derfra er det viktig at jeg prototyper dette med PASCAL for å få riktig parameterhåndtering. Om du kan gjøre noe slikt i VB6 vet jeg altså ikke.

 

Det neste jeg må gjøre i .NET programmet er å dekorere prototypen riktig. Eksempelvis har jeg en funksjon i Clarion DLL'en som kan se slik ut:

 

LeggSammen(Long pInnVerdi1, Long pInnVerdi2), Long, Pascal

 

Når jeg skal bruke denne i .NET skriver jeg slik:

[DllImport("MinDllFil.DLL", EntryPoint = "LEGGSAMMEN")]
public static extern int LeggsammenToTall(int pTall1, int pTall2);

 

Hvis jeg skal bruke strenger er det for meg nødvendig å endre .NET sitt default streng datatype til BStr

 

Eksempelvis kan jeg ha en Clarion funksjon som ser slik ut:

SendOgTaString(String pInnString),String,Pascal

 

Da vil dekoreringen se slik ut:

[DllImport("MinDllFil.DLL", EntryPoint = "SENDOGTASTRING")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern String FåOgTaString([MarshalAs(UnmanagedType.BStr)] String pInnVerdi);

For orden skyld gir jeg deg her eksempel hvordan min ClarionInterop.cs fil ser ut. Dette er en fil jeg brukte i kurs sammenheng i et "Clarion til .NET" kurs jeg hold på mandag som var:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

// Clarion Datatyper
using CWByte = System.Byte;
using CWShort = System.Int16;
using CWUshort = System.UInt16;
using CWLong = System.Int32;
using CWULong = System.UInt32;
using CWSigned = System.Int32;
using CWUnsigned = System.UInt32;
using CWSReal = System.Single;
using CWReal = System.Double;


namespace ClarionIdotNet
{
static class CWInterop
{
	[DllImport("InteropTest", EntryPoint = "CLARIONVINDU")]
	public static extern void VisClarionVindu();

	[DllImport("InteropTest", EntryPoint = "TALONGRETURLONG")]
	public static extern CWLong TaenLongOgFåenLong(CWLong pTallet);

	[DllImport("InteropTest", EntryPoint = "TASTRINGRETURSTRING")]
	[return: MarshalAs(UnmanagedType.BStr)]
	public static extern String MottaStringReturnerString([MarshalAs(UnmanagedType.BStr)] String pVerdi);

	[DllImport("InteropTest", EntryPoint = "OVERVAAKINT")]
	public static extern void VisInt();

	[DllImport("InteropTest", EntryPoint = "GETINT")]
	public static extern CWLong GetInt();

	[DllImport("InteropTest", EntryPoint = "SETINT")]
	public static extern void SetInt(CWLong pValue);
}
}

En ting til, vet ikek om det har noe å si, men jeg bruker alltid STOREBOKSTAVER på entrypoint. Kansje det er viktig. Jeg gjør det fordi Clarion produserer en export file som inneholder alle eksporterte navn og disse er med store bokstaver. Tok det derfor bare for gitt...

Lenke til kommentar

Her registrert den med regsvr32 , men den kommer ikke opp i lista, skal gjør et nytt forsøk når jeg får tilgang til koden.

Sitter på en annen pc atm..

 

edit1:

som sakt den kommer ikke opp i listen du ref. til når du sier:

 

Add Reference og trykk på COM (eller kanskje det står ActiveX :S)

 

VB6 lager ikke C funksjoner, og derfor skal du ikke bruke DllImport.

Endret av Hayer
Lenke til kommentar
Her registrert den med regsvr32 , men den kommer ikke opp i lista, skal gjør et nytt forsøk når jeg får tilgang til koden.

Sitter på en annen pc atm..

 

edit1:

som sakt den kommer ikke opp i listen du ref. til når du sier:

 

Add Reference og trykk på COM (eller kanskje det står ActiveX :S)

 

VB6 lager ikke C funksjoner, og derfor skal du ikke bruke DllImport.

 

Du må trykke Browse

Lenke til kommentar

ah-h.. nå har jeg add'a de som referanse.. Vidre så gjør jeg?

 

fant d ut, hoppet over en post..

 

Module Module1

Sub Main()

Dim m As New AABMinDLL.Class1

Dim x As String

x = m.TestMsg("Testing")

End Sub

End Module

 

btw:

hvordan fjerner jeg referanser?

f.eks jeg har en test DLL, jeg sletter filen, men den referansen kommer fortsatt opp i VB

Endret av Hayer
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...