[C / VB]Dll gebruiken onder VB6

Pagina: 1
Acties:

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
Om een apparaat aan te sturen maak ik onder VB6 gebruik van de Dll zoals die in C/C++ geschreven is. Ik heb de toegang tot de volledige source van de Dll, maar kom er niet uit.

Ik heb gezien dat handle een long betekent, maar wat is dat info en WNDENUMSEARCHPROC.

op verzoek kan ik wat code plaatsen.

  • webloem
  • Registratie: Oktober 2002
  • Laatst online: 16-05 08:54
Declare Function * Lib "*.dll" misschien? Of was je al zover. Iets meer info is wenselijk!

Verwijderd

Inderdaad meer info, maar om je toch verder te helpen kijk een naar het tooltje "API Text Viewer" wat bij VB6 is bijgeleverd. Daar kun je al een hoop rare contanten en structures uit halen.

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
ik heb de volledig code van de DLL tot mijn beschikking, voorbeeldje waar het fout gaat :
code:
1
2
3
4
IMPORT_EXPORT int NECI_FUNC dsc_EnumSearch(DWORD server_ip, WNDENUMSEARCHPROC lpenumproc);
IMPORT_EXPORT int NECI_FUNC dsc_Attach(PDS_INFO info, DS_HANDLE *dshandle);
IMPORT_EXPORT int NECI_FUNC dsc_Detach(DS_HANDLE dshandle);
IMPORT_EXPORT int NECI_FUNC dsc_Locate(DS_HANDLE dshandle, int sw);


ik implementeer deze in VB6 met
code:
1
2
3
4
Private Declare Function dsc_Attach Lib "neci.dll" (PDS_INFO As Long) As Integer
Private Declare Function dsc_EnumSearch Lib "neci.dll" (serverIP As String) As Integer
Private Declare Function dsc_GetAPStatus Lib "neci.dll" (dshandle As Long, status As Integer) As Integer
Private Declare Function dsc_GetName Lib "neci.dll" (ByRef dshandle As Long) As String


als ik bv dsc_Attach doe, dan krijg ik Bad Dll calling convention

  • andrew
  • Registratie: Februari 2001
  • Laatst online: 10-09-2024
Bij dsc_Attach declareer je zo te zien ook niet de juiste parameters.

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
dat dacht ik dus ook, maar in de code staat het volgende:

Arguments
info

[in] Pointer to the DS_INFO structure. User must get this structure from dsc_EnumSearch function.

dshandle

[out] Pointer to the DS_HANDLE to receive the handle of the Network Enabler. This handle is used for other library function.

  • andrew
  • Registratie: Februari 2001
  • Laatst online: 10-09-2024
Ja klopt, die dshandle is een pointer waar de handle in komt te staan, dus zul je die ook in je VB applicatie als pointer moeten declareren.

Maar dat moet je zelf maar even uitzoeken, ik ken geen VB ;)

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
klopt, maar in de C++ code staat dat dsc_EnumSearch twee parameters heeft en 1 returnwaarde (int). Vandaar dat ik het even niet snap.

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
update:

een stukje hoger in de source staat het volgende:
code:
1
2
3
4
5
6
7
8
9
typedef struct _DS_INFO{
    DWORD   apid;
    WORD    hwid;
    WORD    flag;
    DWORD   real_ip_addr;
    DWORD   pseudo_ip_addr;
    DWORD   host_ip_addr;
    BYTE    mac[MACLEN];
}DS_INFO, *PDS_INFO;


moet ik een class in VB maken die er hetzelfde uitziet die als return-waarde fungeert ??

  • andrew
  • Registratie: Februari 2001
  • Laatst online: 10-09-2024
Een class zal niet werken waarschijnlijk, zo te lezen op google moet je een Type aanmaken. Die andere types zullen ook wel structures oid zijn. Gewoon even bovenin de file bij de typedefs kijken.

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
ik zal even met types gaan stoeien, alleen blijf ik het vreemd vinden dat er enerzijds een int teruggegeven wordt, en in de omschrijving vermeld wordt dat er iets anders geretourneerd wordt. Vreemd toch ??

helaas heeft dit geen resultaat, de error bad call dll convention blijft terugkomen...

[ Voor 18% gewijzigd door pkouwer op 07-12-2004 09:59 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Dat is nu net de reden waarom er een pointer wordt meegegeven. In de Basic wereld heet dat een ByRef parameter.
Vaak is het zo dat een DLL aanroep een integer returnt om aan te geven of de call goed gegaan is of niet en wat er dan zoal fout gegaan is. Overige return waardes worden via een pointer (en dus in VB via een ByRef) doorgegeven.

Kijk anders hier voor meer informatie.

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10-2025
ik ben inmiddels een stukje verder, alleen zit ik nog met het probleem, wat betekent dit in de C++ dll:
code:
1
typedef int (CALLBACK* WNDENUMSEARCHPROC)(PDS_INFO);

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 17-05 17:19
Dat is een functiepointer ( Die word iha gebruikt om callback functies te kunnen gebruiken )

In VB kun je daarvoor een kleine hack schrijven, die het adres van de VB functie als long teruggeeft. Schrijf daarvoor een functie die een long als parameter heeft en diezelfde parameter teruggeeft. De functie roep je dan aan met als parameter AdressOf [Jouw Functie]

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

Je moet de dll wel in de System (of System32) directory zetten in de windows map, als je het programma uitvoert in VB6
Pagina: 1