Toon posts:

[C++/VB6]DLL Functie aanroep

Pagina: 1
Acties:
  • 122 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Thans hebben wij een pakket aangeschaft van Sumihiro. Het betreft een Call Catcher.

Er zit een API (dll) bij die functionaliteit tussen Client en server kan verschaffen.

nu zit ik met een klein probleem.

Ik krijg met geen mogelijkheid een functie aangeroepen vanuit Visual Basic 6 (cpp is niet mijn ding, java kan niet gezien de al draaiende applicatie, delphi heeft me werk niet).

Ik wil graag een activeX component maken.

Nu is het probleem, hoe roep ik de functies uit de dll aan in visual basic.

de volgende .h file is bijgeleverd.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//---------------------------------------------------------------------------

#ifndef uiH
#define uiH

#ifdef __cplusplus
    extern "C" {
#endif


#ifdef __DLL__
#   define DLL_EXP __declspec(dllexport)
#else
#   define DLL_EXP __declspec(dllimport)
#endif

//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_EVENT(
    int  *As_id,
    int  *At_id,
    char *AMsg1,
    int  *AMsg1Len,
    char *AMsg2,
    int  *AMsg2Len
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_CONNECT(
    int  As_id,
    int  At_id,
    char *AUser,
    char *APassword,
    char *AHost,
    char *AService,
    int  ATCP,
    int  AUDP,
    int  AReserved
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_DISCONNECT(
    int As_id, int At_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_POLL(
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_ARTICLERANGE(
    int As_id, int At_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_GET_ARTICLEHEADER(
    int As_id, int At_id, int ia_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_GET_ARTICLEHEADERS(
    int As_id, int At_id, int iMina_id, int iMaxa_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_MOD_ARTICLEHEADER(
    int As_id, int At_id, int Aa_id, char *AData, int ALenData
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_DEL_ARTICLE(
    int As_id, int At_id, int Amina_id, int Amaxa_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_XFER_DOWNLOAD(
    int As_id, int At_id, char *ARemoteFile, int AOffset
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_XFER_UPLOAD(
    int As_id, int At_id, char *ARemoteFile
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_XFER(
    int As_id, int At_id, int ABytesToDownload, char *AUploadDAta
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_XFER_END(
    int As_id, int At_id
);
//---------------------------------------------------------------------------
DLL_EXP int __stdcall CC_DECODE_HEADER(
    int As_id, char *AFileName, char *AHeader, int &AHeaderLen
);
//---------------------------------------------------------------------------
DLL_EXP int __stdcall CC_UPDATE_HEADER(
    int As_id, char *AFileName, char *AHeader, int AHeaderLen
);
//---------------------------------------------------------------------------
DLL_EXP int __stdcall CC_DECODE_AUXFRAME(
    int As_id, char *AFilename, int AFrameNo,
    char *ADataOutPCMdata, int &ADataOutLen
);
//---------------------------------------------------------------------------
DLL_EXP int __stdcall CC_HEADER_GET_ITEM(
    char *ACompleteMsg, char *AItemName, char *AValue
);
//---------------------------------------------------------------------------
DLL_EXP int __stdcall CC_HEADER_SET_ITEM(
    char *ACompleteMsg, char *AItemName, char *AValue
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_STREAM_INIT(
    int As_id, int At_id, int APort
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_STREAM_START(
    int As_id, int At_id, int AHistory
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_STREAM_STOP(
    int As_id, int At_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_STREAM_CLOSE(
    int As_id, int At_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_PING(
    int As_id, int At_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_GET_DATETIME(
    int As_id, int At_id
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_DISKSIZE(
    int As_id, int At_id, char ADrive
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_DISKFREE(
    int As_id, int At_id, char ADrive
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_PQL_SUBMIT(
    int As_id, int At_id, char *ASubmission
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_SIM_EVENT(
    int As_id, int At_id, int Ap_id, int AEvent, char *AExtra, int AExtraLen
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_ENABLE_EVENTS(
    int As_id, int At_id, int Aport, int AActivate
);
//---------------------------------------------------------------------------
DLL_EXP void __stdcall CC_REBUILD_DATABASE(
    int As_id, int At_id
);
//---------------------------------------------------------------------------

#ifdef __cplusplus
    }
#endif

#endif


en deze code gebruik ik

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Option Explicit

'// global variable

Dim As_id As Long
Dim At_id As Long

Dim AUser() As Byte
Dim APassword() As Byte
Dim AHost() As Byte
Dim AService() As Byte

Dim Amsg1() As Byte
Dim Amsg2() As Byte
Dim AMsg1Len As Long
Dim AMsg2Len As Long


'// DLL Imports

Private Declare Function CC_CONNECT _
Lib "c:\Api\cc2k_dll.dll" ( _
    ByVal As_id As Long, _
    ByVal At_id As Long, _
    ByRef AUser() As Byte, _
    ByRef APassword() As Byte, _
    ByRef AHost() As Byte, _
    ByRef AService() As Byte, _
    ByVal ATCP As Long, _
    ByVal AUDP As Long, _
    ByVal AReserved As Long _
)

Private Declare Function CC_DISCONNECT _
Lib "c:\Api\cc2k_dll.dll" ( _
    ByVal As_id As Long, _
    ByVal At_id As Long _
)

Private Declare Function CC_PING _
Lib "c:\Api\cc2k_dll.dll" ( _
    ByVal As_id As Long, _
    ByVal At_id As Long _
)

Private Declare Function CC_POLL _
Lib "c:\Api\cc2k_dll.dll" ()


ik krijg OF "Bad dll calling convention" (dat schijnt een run-time bug te zijn)

of de functie wordt wel aangeroepen maar hij doet niets. (geen error, maar ook geen activiteit)

iemand enig idee hoe dit werkend te maken valt? want ik kan de fout niet vinden.

Verwijderd

Topicstarter
er moet toch iemand zijn die dit weet?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 20:55

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 02 juli 2004 @ 14:24:
er moet toch iemand zijn die dit weet?
Vast wel, maar sommigen van ons hebben naast GoT wel een prive leven, dus reageren we niet altijd binnen een uur.

Tip: een * in C is een pointer. Dus dat moet je in VB ByRef doorgeven i.p.v. ByVal.
Edit: ah, dat doe je al.. my bad ;)

[ Voor 6% gewijzigd door Creepy op 02-07-2004 14:27 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik hou het rustig ;)

Zal niemand pushen.

Maar het is een kut probleem en het zit me flink dwars :)

Verwijderd

Is het niet zo dat als je het returntype van een Function niet specificeert, dat je dan een Variant krijgt? Ik zou zeggen probeer eens een Sub ipv een Function, of laat hem expliciet een Long returnen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 02 juli 2004 @ 14:24:
er moet toch iemand zijn die dit weet?
Verwijderd schreef op 02 juli 2004 @ 14:44:
Ik hou het rustig ;)

Zal niemand pushen.

Maar het is een kut probleem en het zit me flink dwars :)
Zou je voortaan je topic pas willen kicken na 24 uur, zoals in de FAQ beschreven staat? Heb gewoon geduld, als er iemand is die iets weet komt er vanzelf wel iemand langs :)

(Btw, het heet trouwens C++, niet Cpp ;))

Wat je probleem betreft, de functies hebben geen return values, dus je moet ze dan ook declareren als Sub, niet als Function. Verder lijkt het me wel goed te gaan

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Misschien heb je hier iets aan?

MSDN

Ook iets wat ik zou doen is niet met ByteArray's werken, maar met strings... Ik geloof dat VB die char*'s automatisch kopieert in een BSTR(VB-string) object

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Verwijderd schreef op 03 juli 2004 @ 01:50:
Misschien heb je hier iets aan?

MSDN

Ook iets wat ik zou doen is niet met ByteArray's werken, maar met strings... Ik geloof dat VB die char*'s automatisch kopieert in een BSTR(VB-string) object
Op zich gaat dat best goed, je moet dit echter niet doen als het geen 'const char *' parameter is, want een BSTR aanpassen zonder de goede methode te gebruiken gaat verkeerd.

Het is dan beter om een fixed length string te gebruiken ( Dim Blaat as String * 255 ), en deze voor het passen naar de dll te vullen met spaties oid.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Dank allen. Ik ga het even proberen

Verwijderd

Topicstarter
Helaas, geen van het bovenstaande werkt.

Ik heb de dll maar even ergens geupload.

http://dev.nutshell.tk/files/cc2k_dll.dll

Het probleem is dat de functies die in de dll zitten ik met geen mogelijkheid aan de praat krijg. De volgende code is het laatste wat ik geprobeerd heb.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
'// global variable

Dim As_id As Long
Dim At_id As Long

Dim AUser As String
Dim APassword As String
Dim AHost As String
Dim AService As String

Dim Amsg1 As String
Dim Amsg2 As String
Dim AMsg1Len As Long
Dim AMsg2Len As Long


'// DLL Imports

Private Declare Sub CC_CONNECT _
Lib "c:\Api\cc2k_dll.dll" ( _
    ByVal As_id As Long, _
    ByVal At_id As Long, _
    ByRef AUser As String, _
    ByRef APassword As String, _
    ByRef AHost As String, _
    ByRef AService As String, _
    ByVal ATCP As Long, _
    ByVal AUDP As Long, _
    ByVal AReserved As Long _
)

Private Declare Sub CC_DISCONNECT _
Lib "c:\Api\cc2k_dll.dll" ( _
    ByVal As_id As Long, _
    ByVal At_id As Long _
)

Private Declare Sub CC_PING _
Lib "c:\Api\cc2k_dll.dll" ( _
    ByVal As_id As Long, _
    ByVal At_id As Long _
)

Private Declare Sub CC_POLL _
Lib "c:\Api\cc2k_dll.dll" ()


Met als aanroep:

code:
1
CC_CONNECT 0, 400, AUser, APassword, AHost, AService, 8777, 0, 0

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maak van die 4 Byref Strings eens een Byval Long, en geef dan een string met die VarPtr operator (of heet ie ook alweer? Je kunt iig een adres terugkrijgen van waar de string staat, als Long). Niet vergeten er eerst een Chr (0) achter te plakken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

.oisyn schreef op 06 juli 2004 @ 17:27:
Je kunt iig een adres terugkrijgen van waar de string staat, als Long). Niet vergeten er eerst een Chr (0) achter te plakken
Je kunt de volgende functie gebruiken om van een pointer een string te krijgen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Function VBStrFromAnsiPtr(ByVal lpStr As Long) As String
    Dim bStr() As Byte
    Dim cChars As Long
    On Error Resume Next
    
    cChars = lstrlen(lpStr)
    
    ReDim bStr(0 To cChars - 1) As Byte
    
    Call CopyMemory(bStr(0), ByVal lpStr, cChars)
    
    VBStrFromAnsiPtr = StrConv(bStr, vbUnicode)
End Function


Het is ook mogelijk om een string naar een pointer om te zetten, ben de code nog ff aan het zoeken...

[ Voor 15% gewijzigd door Verwijderd op 06-07-2004 17:42 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
Als je strings in VB byval door geeft, en in C als const char * declareert moet het goed gaan.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Helaas. Geen van de genoemde oplossingen werkt.

Ik laat het denk ik maar hangen en pak er een andere programmeer taal bij.
Pagina: 1