Hej, Har du prövat att dimisionera dina string*xxx enlit följande Jag antar att den gamla DLL:n är skriven i C? Kan man i sådana fall få se definitionen av "tagPCDEXTHDR"? För övrigt, notera att BOOL's i C inte är detsamma som Booleans i VB (i alla fall inte VB6, är osäker på VB.NET). TRUE/FALSE i C är 1/0 och -1/0 i VB 6 (och kanske .NET). Med andra ord får du ändra funktiondeklarationen till... I C, C++ osv, ja, men i VB.NET är det ej riktigt detsamma... Nja, att den internt använder -1 för true är så enkelt som att det binärt är 1111111111111111 (osv, beroende på längden på värdetypen), det är alltså väldigt enkelt att utföra binära operationer på dem då. När den kollar om något är true så kollar den bara om det är 0 eller inte, är det 0 så är det false, annars true. Jag förutsätter att Typen ovan är hur den definieras i VB6. Jag har varit borta från projektet några dagar, men nu skall jag definitivt prova tipsen jag fått, tack för hjälpen så här långt och jag återkommer med resultatet så småningom.Använda gammal DLL i vb.net
Jag har en applikation som använder en kommunikations dll. Denna dll är från 95 eller något sådant men jag behöver ändå använda den.
Poblemet är att den kod som finns för dll en är gjord för VB och innehåller en del saker som inte finns i .net. Det rör sig främst om Type (nu Structure i stället har jag förstått). Dessutom en hel del Dim Test as String*255 dvs storleksdefinierade variabler.
Jag har provat att helt sonika byta ut Typedef mot structure samt tagit bort alla storleks definitioner men det går absollut inte att få det att funka. Många kul grejor händer, dels felmeddelanden från Dll en om ogiltiga storlekar samtdessutom system crasher av olika magnitud...
Någon som har bra tips om hur man bäst löser detta, jag tror problemen kommer av storleksdefinierade variabler men det kan givetvis vara anra orsaker också. Jag kan få vissa saker att fungera mot dllen.
Här kommer några exempel på hur det kan se ut i VB:
<CODE VB>
Public Type tagPCDEXTHDR '/* PCD modem strings: */
bHasModem As Integer '/* TRUE=modem configured */
ModemName As String * 36 '/* 35 bytes + NUL */
PCDReset As String * 129 '/* 128 bytes + NUL */
PCDInit As String * 129 '/* Gateway configuration: */
bHasGway As Integer '/* TRUE=Gateway configured */
GwayPort As Integer
GwayBaud As Integer
GwayCpu As Integer
GwayMode As Integer
GwayTout As Integer
GwayTSDel As Integer
GwayTNDel As Integer
Spare As Integer '/* (was GwayTout1, now not used) */
GwayBreakLen As Integer
End Type
'/* PCD connection control structure */
Public Type tagPCDCONN
Dummy As String * 685
End Type
</CODE>
Och lite av deklarationerna...
<CODE VB>
Public Declare Function PcdConnectionDialog1 Lib "c:\temp\SCOM32L1.DLL" (ByRef PCDCONN As tagPCDCONN) As Boolean
</CODE>
PS. God fortsättnig till er alla...DS.Sv: Använda gammal DLL i vb.net
Dim variabelnamn as char()
Sedan när du skapar en variabel av structure-typen måste du köra en redim a.variabelnamn(36) eller hur stor den nu skall vara
Hoppas detta hjälperSv: Använda gammal DLL i vb.net
Public Declare Function PcdConnectionDialog1 Lib "c:\temp\SCOM32L1.DLL" (ByRef PCDCONN As tagPCDCONN) As Integer ' BOOL är en typedef för int i C.
Sv: Använda gammal DLL i vb.net
Testa följande kod och säg mig vad du får för resultat.
Dim temp As Boolean = True
MsgBox(CInt(temp))
temp = False
MsgBox(CInt(temp))
Själv fick jag -1 och sedan 0. Det är egentligen inget fel med att använda Boolean då VB.NET verkar konvertera TRUE (1) till -1 som är VB.NETs motsvarighet, men är man petig som jag så ändrar man deklarationen till Integer.;)
Sv:Använda gammal DLL i vb.net
Om api:t enligt dokumentationen retunerar ett boolskt värde så ska du rimligtvis också deklarera den externa funktionen så att den retunerar ett boolskt värde, att själv göra ett test som .net annars skulle göra åt dig blir bara ful och jobbig kod i slutändan.Sv: Använda gammal DLL i vb.net
Då gäller bl.a. följande, alla Integer måste bytas till Short. I VB6 är integer = Int16 men i .net är det en Short som är 16 bit.
Fasta strängar deklarerar du med en tag framför som anger storleken.
<VBFixedString(255)>Public sMyString as String
Sedan finns ytterligare ett problem och det är hur strukturen är packad i C. VB6 har ju alltid 4 byte alignment så när typskifte i strukturen inte går jämt ut med 4 byte kan det bli problem om inte C-strukturen också är deklarerad med 4 byte alignment.
Men i VB.Net kan även detta styras (gick inte i VB6) med hjälp av tagdirektv, där Pack anger alignment:
<StructLayout(LayoutKind.Sequential, Pack:=1)> Public Class MyData....
Observera att detta bara går med klasser men det brukar gå lika bra att deklarera strukturen som en klass med bara data och använda den som en struktur.Sv: Använda gammal DLL i vb.net
//Fredric