Hayer Skrevet 1. november 2007 Del Skrevet 1. november 2007 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
j000rn Skrevet 1. november 2007 Del Skrevet 1. november 2007 (endret) Public Sub Yea(ByVal test As String) test = test + " hehe, det funker!" MsgBox (test) End Sub Endret 1. november 2007 av jorn79 Lenke til kommentar
Hayer Skrevet 1. november 2007 Forfatter Del Skrevet 1. november 2007 bare en eksempel DLL fra VB6... Har mer avanserte DLLer som inneholder MYE flere funksjoner, så trenger helst en løsning, ikke en re-write. Lenke til kommentar
GeirGrusom Skrevet 1. november 2007 Del Skrevet 1. november 2007 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. Lenke til kommentar
backup Skrevet 2. november 2007 Del Skrevet 2. november 2007 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
HDSoftware Skrevet 2. november 2007 Del Skrevet 2. november 2007 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
Hayer Skrevet 2. november 2007 Forfatter Del Skrevet 2. november 2007 (endret) 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 2. november 2007 av Hayer Lenke til kommentar
GeirGrusom Skrevet 2. november 2007 Del Skrevet 2. november 2007 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
Hayer Skrevet 2. november 2007 Forfatter Del Skrevet 2. november 2007 (endret) 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 2. november 2007 av Hayer Lenke til kommentar
Manfred Skrevet 2. november 2007 Del Skrevet 2. november 2007 Sletter referansen fra "references"?? Lenke til kommentar
backup Skrevet 3. november 2007 Del Skrevet 3. november 2007 hvordan fjerner jeg referanser?f.eks jeg har en test DLL, jeg sletter filen, men den referansen kommer fortsatt opp i VB Hvis test.dll er en vb6-dll, prøv med: regsvr32 /u .... for å avregistrere test.dll. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå