[VB.NET] gebruik custom DLL

Pagina: 1
Acties:

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Ik ben al een tijdje aan het kloten met me DLL's, en die buitenom C/C++ te gebruiken, maar het wil nog niet echt lukken. Als ik er een COM DLL van maak dan werkt het vast wel, maar ik wou het niet registreren, gewoon ernaast in de directory.

Hier is de situatie: ik heb een hele mooie klass gemaakt, en die helemaal geexporteerd in een dll. Nou duurde het een tijdje dat ik erachter kwam dat je in VB geen classe DLL imports kan doen, alleen functiones (afgezien van COM dan). Dus ik heb er een simpele wrapper om mijn klasse gemaakt, die gewoon alles afhandelt en een char * teruggeeft. In mijn VB code heb ik tot nu toe dit:

Visual Basic:
1
2
3
4
5
6
7
Private Declare Auto Function ConnectURL Lib "<path naar me dll>\DLLWrapper.dll" (ByVal UserAgentString, ByVal httpURL) As String

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim x As String
    x = ConnectURL("Opera", "http://www.google.com")
    urlbox.Text = x
  End Sub


De functie ConnectURL ziet er in C++ gewoon zo uit:
C:
1
extern "C"  __declspec( dllexport ) char * ConnectURL(char * cUserAgentString, char * chttpURL);

Deze functie deed zeer veel maar nu doet ie alleen maar:
C:
1
2
3
4
char * ConnectURL(char * cUserAgentString, char * chttpURL) {
  char * q = "llalalllllalalla";
  return q;
}


Alle aanroepen, etc gaan gewoon goed in C/C++ programma's. Maar zodra ik bij de lijn ConnectURL("Opera", "http..... aankom, krijg ik een NullReferenceException exception met de mededeling Object reference not set to an instance of an object. (Ook als ik gewoon de functie aanroep, zonder de resultaat te gebruiken, krijg ik dit).

Hoe is dit op te lossen?

[ Voor 4% gewijzigd door Darkvater op 07-03-2004 03:05 ]


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


Verwijderd

Je zou even moeten kijken waar de NullRef.exception optreed. Welke statement hem procies veroorzaakt. En met een paar watchers even kijken, wie, wat en waar gevult word etc.

  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Verwijderd schreef op 07 maart 2004 @ 11:34:
Je zou even moeten kijken waar de NullRef.exception optreed. Welke statement hem procies veroorzaakt. En met een paar watchers even kijken, wie, wat en waar gevult word etc.
Oops, ik zie net dat ik bij DllImport geen type heb gedaan, dus ze waren altijd van object type, en geen string |:( .

Maar nu het volgende probleem :)

Als ik de functie aanroep, dan krijgt UserAgentString en httpURL alleen de eerste character van de argumenten.

dus char * UserAgentString wordt 'O' en die andere 'h'. Nou, nog ff uitvogelen hoe dat is :)


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge


  • Darkvater
  • Registratie: Januari 2001
  • Laatst online: 26-08-2024

Darkvater

oh really?

Topicstarter
Ik ben er overheen....maar wat vreemd, want hij wil nog steeds niet echt lukken.
Als ik ConnectURL vanuit VB aanroep met bijvoorbeeld argument1 als "abcde", krijgt cUserAgentString alleen de waarde 'a'.

Maar als ik de array langsga:
code:
1
2
3
4
5
6
7
8
9
10
cUserAgentString[0] = 'a';
cUserAgentString[1] = 0
cUserAgentString[2] = 'b';
cUserAgentString[3] = 0
cUserAgentString[4] = 'c';
cUserAgentString[5] = 0
cUserAgentString[6] = 'd';
cUserAgentString[7] = 0
cUserAgentString[8] = 'e';
cUserAgentString[9] = 0

De rest hierna is garbage. He, maar ik snap het niet. Iemand die het mij kan uitleggen? En natuurlijk hoe ik het op kan lossen? :) Internet is tot nu toe niet zo vriendelijk geweest :|

edit:
Ah, hebbes :D. Het blijkt dat mijn C functions als CDecl geexporteerd worden worden, en VB standaard stdcall gebruikt. Toen deze code gebruikt als import, en de argumenten komen goed over :D

Visual Basic:
1
2
3
4
  <DllImport("<path naar me dll>DLLWrapper.dll", _
  EntryPoint:="ConnectURL", CallingConvention:=CallingConvention.Cdecl)> _
  Public Shared Function ConnectURL(ByVal UserAgentString As String, ByVal httpURL As String) As String
  End Function


Nu alleen nog de return opvangen, want dat wil die nog niet.
Ik return een char * (of LPCTSTR), maar de value in VB krijgt niks...hmm. Als iemand een goed idee heeft _/-\o_

Hmm, ook als ik gewoon een integer teruggeef, en opvang, neemt ie dat niet op. Iets gaat er niet goed :'(

[ Voor 45% gewijzigd door Darkvater op 07-03-2004 19:37 ]


Windows Vista? *NEVER* Het waarom - Opera forever!!!
I've seen chickens that were more menacing. Chickens in a coma. On ice. In my fridge