» »

[VB 6] Klicanje funkcij dll-ja, napisanega v Cju.

[VB 6] Klicanje funkcij dll-ja, napisanega v Cju.

lukanium ::

Torej, imam neko periferno napravo na PCI (ena kamerca za merjenje očesnih premikov), ki ima priloženo osnovno aplikacijo in SDK, da lahko seveda uporabljaš raznorazne funkcije tudi v svojih programih. V osnovi je vse skupaj namenjeno za C, tako da SDK sestavljajo C dll, statična knjižnica (.lib) in header file z definicijami funkcij.

Problem je v tem, da uporabljam VB za svoj program, ki se nikakor noče sporazumeti z dll-jem (torej preko declare...). Nekako mi še rata zagnati samo aplikacijo od proizvajalca kamerce, od tu naprej pa se ustavi --> bad dll calling convention (torej ni napisan kot stdcall?).

Poleg tega seveda ni možno:
- ga registrirati z Regsvr32
- ali v VB preko project-> references... javi napako: Can't add a reference to the specified file.

Ima kdo kakšno idejo, kako bi se to rešilo? Torej, kako bi lahko normalno klical funkcije tega dll-ja iz VB-ja?

Vnaprej hvala za vse predloge!
When a person can no longer laugh at himself,
it is time for others to laugh at him. [Thomas Szasz]

darkolord ::

Kako pa kličeš funkcijo z declare? Mogoče je problem v parametrih...
spamtrap@hokej.si
spamtrap@gettymobile.si

Zgodovina sprememb…

  • spremenilo: darkolord ()

lukanium ::

Problem je v tem, da je za ta dll uporabljen __cdecl calling convention in ne __stcall. Torej na način, ki je privzet za C(++), VB pa zna brati samo __stdcall, pri čemer moraš pri ustvarjanju dll-ja priključiti še .def file, v katerem enostavano opredeliš/našteješ vse funkcije v dll-ju, ki jih boš potem klical iz VB-ja. Samo na ta način bi naj VB znal pravilno prebrati dll. However...

... Po razbijanju glave ob steno sem ugotovil, da vse skupaj (zaenkrat se tako zdi) normalno dela, če z 'On Error Resume Next' :D lepo ignoriraš napako 49 (bad dll calling convention). Trenutno se mi ne da ugotavljati, zakaj dela, ker se mi tako zelo mudi z vsem skupaj, da mi je čisto vseeno. Nisem še vsega temeljito stestiral, tako da zaenkrat dejasnko še ne vem, če je ta rešitev (polno) funkcionalna. Če kdo ve, da tako 'potlačevanje' napake prinese s sabo kake napake, naj prosim pride z besedo na plan! :)
When a person can no longer laugh at himself,
it is time for others to laugh at him. [Thomas Szasz]

darkolord ::

On Error Resume Next preskoči vse stvari, kjer so napake... Torej isto, kot da tega klica sploh ne bi imel...

Drugače, če hočeš samo določeno napako "potlačit", je boljše kaj takega:

Sub Nekaj()
  On Error Goto Hell:
  
  'Tukaj je vsebina
  Exit Sub
Hell:
  If Error.Number = 49 Then
     Resume Next
  End If
End Sub
spamtrap@hokej.si
spamtrap@gettymobile.si

NavadniNimda ::

Lukanium - vzemi si tiste pol ure cajta, pa naredi WRAPPERJE v C-ju, ki so _stdcall in jih zapakiraj v DLL. Nato kličeš ta svoj DLL iz VBja, un pa skrbi da parametre obrne, pokliče originalni DLL, poskrbi za vrnitveno vrednost in popuca stack za sabo.
"No big deal", kot pravijo.:|

lukanium ::

"No big deal", kot pravijo.

Hm, kak za koga ;)

Vsekakor hvala za predlog.
Maš mogoče kak link? Al pa se ti da sem prilepiti kak zlo enostaven primer takega wrapperja? V C-ju nisem nikoli nič delal :(

Našel sem recimo to, vendar mi ni dovolj razumljivo.
When a person can no longer laugh at himself,
it is time for others to laugh at him. [Thomas Szasz]

lukanium ::

@NavadniNimda: Sva s kolegom malo pogledala po netu in koliko zdaj to razumeva, za kaj takega rabiš specifikacijo strukture podatkov, ki se pošiljajo funkcijam in se vračajo... torej rabim source tega dll-ja? Sprašujem zato, ker ga trenutno sicer nimam, bi se ga pa mogoče dalo dobiti...
When a person can no longer laugh at himself,
it is time for others to laugh at him. [Thomas Szasz]

NavadniNimda ::

Ne, tako kot si hotel klicati iz VB-ja, tako kličeš iz C-ja. Odnosno C++ bo ta prav. Pazi na to, da so recimo STRING tipi v VBju nekoliko drugačni od tistih v C-ju (v VB ni ZERO terminated!), pa tudi recimo INT v VBju je 16-bitna vrednost. Če imaš specifikacijo parametrov za une C funkcije v DLL, gotovo ne sme biti problem tega narest. 8-)

Drži pa, da nisem že ene 5 let delal s C++ pod Windowsi!:8)

EDIT:
Ja, Lukanium, un link je ta pravi!!:))
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q153586

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

serijska za xp

Oddelek: Pomoč in nasveti
91010 (818) OwcA
»

sesut search v win XP

Oddelek: Pomoč in nasveti
5531 (453) mb
»

Odstranitev programa Office v celoti

Oddelek: Programska oprema
6943 (867) LuckyMato
»

[.NET ali c#] ne najdem dokumentacije

Oddelek: Programiranje
81028 (874) atasmrk
»

Serijske številke pri Windows XP professional!!!!!

Oddelek: Pomoč in nasveti
91261 (1096) BigBoss

Več podobnih tem