Still didn't want to work. I can email you the DLL if you dont mind trying it out.
email me at dave@wolf.ca
Main Topics
Browse All TopicsI'm trying to make a call to a c++ DLL in visual basic, the c definition for the functions are as follows. Can someone help me setup VB to be able to call them.
bool ConnectedDevices (bool * bDeviceArray)
bool EnumerationType (int iDeviceNum, bool * bDeviceConnected, int * iFirmWare)
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
I'm getting a "Runtime Error '49' Bad DLL calling convention"
The info i posted is not exact name. i ws tring to make it simple. Its a API from www.passmark.com for USB testing. (Free Download USB2API.ZIP)
here is the actual details from the manual for one of the functions. If I can figure this one out, the rest might be easy.
Function Name: USB2GetConnectedPlugs
bool USB2GetConnectedPlugs (bool * bDeviceArray)
Description: Get an array of USB Device numbers that identify each USB2 plug currently
connected to the system. The device number is assigned by the USB2 device driver
and is the key when accessing the USB2Loopback device. The device number is
assigned on connection, and de-assigned on de-connection. The plug may receive a
different number when reconnecting to the system
Parameters: bDeviceArray [out]
Pointer to array indicating if the a plug is connected at device number indicated by
the index. The array must be of size: MAX_USB_DEV_NUMBER
Return Values: True for success. False for failure.
I'm not getting it to work. It looks like the DLL is using declspec for the function exports as seen in usb2dll.h:
extern "C" __declspec(dllexport) bool USB2GetConnectedPlugs(bool
The closest I got was a GPF using the code below:
Private Const MAX_USB_DEV_NUMBER = 32
Private Declare Function USB2GetConnectedPlugs Lib "USB2Dll.dll" Alias "#7" (ByRef bDeviceArrary As Boolean) As Boolean
Private Sub Command1_Click()
Dim bResult As Boolean
Dim MyArr() As Boolean
Dim ArrSize As Long
ArrSize = MAX_USB_DEV_NUMBER
ReDim MyArr(ArrSize) As Boolean
bResult = USB2GetConnectedPlugs(MyAr
End Sub
You might want to contact the vendor of the DLL....
'This may help you if you can't get the C DLL to work
--------- DeviceChanges.bas -------------
Option Explicit
Public Type GUID
Data1(1 To 4) As Byte
Data2(1 To 2) As Byte
Data3(1 To 2) As Byte
Data4(1 To 8) As Byte
End Type
Public Type DEV_BROADCAST_DEVICEINTERF
dbcc_size As Long
dbcc_devicetype As Long
dbcc_reserved As Long
dbcc_classguid As GUID
dbcc_name As Long
End Type
Public Type DEV_BROADCAST_DEVICEINTERF
dbcc_size As Long
dbcc_devicetype As Long
dbcc_reserved As Long
dbcc_classguid As GUID
dbcc_name As String * 1024
End Type
Public Declare Function RegisterDeviceNotification
Alias "RegisterDeviceNotificatio
ByVal hRecipient As Long, _
NotificationFilter As Any, _
ByVal Flags As Long) As Long
Public Declare Function UnregisterDeviceNotificati
(ByVal hRecipient As Long) As Long
Public Const DEVICE_NOTIFY_ALL_INTERFAC
Public Const DEVICE_NOTIFY_WINDOW_HANDL
Public Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (Destination As Any, Source As Any, _
ByVal Length As Long)
Public Declare Function CallWindowProc Lib "user32" _
Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_DEVICECHANGE = &H219
Public Const UNSAFE_REMOVE = &H1C
Public glngPrevWndProc As Long
Public Type DEV_BROADCAST_HDR
dbch_size As Long
dbch_devicetype As Long
dbch_reserved As Long
End Type
Public Const DBT_CONFIGCHANGECANCELED As Long = 25
Public Const DBT_CONFIGCHANGED As Long = 24
Public Const DBT_CUSTOMEVENT As Long = 32744
Public Const DBT_DEVICEARRIVAL As Long = 32768
Public Const DBT_DEVICEQUERYREMOVE As Long = 32769
Public Const DBT_DEVICEQUERYREMOVEFAILE
Public Const DBT_DEVICEREMOVECOMPLETE As Long = 32772
Public Const DBT_DEVICEREMOVEPENDING As Long = 32771
Public Const DBT_DEVICETYPESPECIFIC As Long = 32773
Public Const DBT_DEVNODES_CHANGED As Long = 7
Public Const DBT_QUERYCHANGECONFIG As Long = 23
Public Const DBT_USERDEFINED As Long = 65535
Public Const DBT_DEVTYP_OEM As Long = 0
Public Const DBT_DEVTYP_DEVNODE As Long = 1
Public Const DBT_DEVTYP_VOLUME As Long = 2
Public Const DBT_DEVTYP_PORT As Long = 3
Public Const DBT_DEVTYP_NET As Long = 4
Public Const DBT_DEVTYP_DEVICEINTERFACE
Public Const DBT_DEVTYP_HANDLE As Long = 6
Public Function MyWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim dbHdr As DEV_BROADCAST_HDR
Dim dbDdb As DEV_BROADCAST_DEVICEINTERF
Select Case Msg
Case WM_DEVICECHANGE
Debug.Print "WM_DEVICECHANGE " & Msg
Select Case wParam
Case DBT_CONFIGCHANGECANCELED
Debug.Print "wParam = DBT_CONFIGCHANGECANCELED"
Case DBT_CONFIGCHANGED
Debug.Print "wParam = DBT_CONFIGCHANGED"
Case DBT_CUSTOMEVENT
Debug.Print "wParam = DBT_CUSTOMEVENT"
Case DBT_DEVICEARRIVAL
Debug.Print "Deviced Plugged In"
CopyMemory dbHdr, ByVal (lParam), Len(dbHdr)
Select Case dbHdr.dbch_devicetype
Case DBT_DEVTYP_OEM
Debug.Print "Device Type: DBT_DEVTYP_OEM"
Case DBT_DEVTYP_DEVNODE
Debug.Print "Device Type: DBT_DEVTYP_DEVNODE"
Case DBT_DEVTYP_VOLUME
Debug.Print "Device Type: DBT_DEVTYP_VOLUME"
Case DBT_DEVTYP_PORT
Debug.Print "Device Type: DBT_DEVTYP_PORT"
Case DBT_DEVTYP_NET
Debug.Print "Device Type: DBT_DEVTYP_NET"
Case DBT_DEVTYP_DEVICEINTERFACE
Debug.Print "Device Type: DBT_DEVTYP_DEVICEINTERFACE
CopyMemory dbDdb, ByVal (lParam), ByVal (dbHdr.dbch_size)
Debug.Print "Device Name: " & Mid(dbDdb.dbcc_name, 1, InStr(dbDdb.dbcc_name, Chr(0)))
Case DBT_DEVTYP_HANDLE
Debug.Print "Device Type: DBT_DEVTYP_HANDLE"
Case Else
Debug.Print "Device Type unknown: " & CStr(dbHdr.dbch_devicetype
End Select
Case DBT_DEVICEQUERYREMOVE
Debug.Print "wParam = DBT_DEVICEQUERYREMOVE"
Case DBT_DEVICEQUERYREMOVEFAILE
Debug.Print "wParam = DBT_DEVICEQUERYREMOVEFAILE
Case DBT_DEVICEREMOVECOMPLETE
Debug.Print "Device UN-PLUGGED"
Case DBT_DEVICEREMOVEPENDING
Debug.Print "wParam = DBT_DEVICEREMOVEPENDING"
Case DBT_DEVICETYPESPECIFIC
Debug.Print "wParam = DBT_DEVICETYPESPECIFIC"
Case DBT_DEVNODES_CHANGED
Debug.Print "wParam = DBT_DEVNODES_CHANGED"
Case DBT_QUERYCHANGECONFIG
Debug.Print "wParam = DBT_QUERYCHANGECONFIG"
Case DBT_USERDEFINED
Debug.Print "wParam = DBT_USERDEFINED"
Case Else
Debug.Print "wParam = unknown = " & wParam
End Select
End Select
' pass the rest messages onto VB's own Window Procedure
MyWindowProc = CallWindowProc(glngPrevWnd
End Function
Public Function DoRegisterDeviceInterface(
Dim NotificationFilter As DEV_BROADCAST_DEVICEINTERF
NotificationFilter.dbcc_si
NotificationFilter.dbcc_de
hDevNotify = RegisterDeviceNotification
If hDevNotify = 0 Then
MsgBox "RegisterDeviceNotificatio
DoRegisterDeviceInterface = False
Exit Function
End If
DoRegisterDeviceInterface = True
End Function
------------- Form1 ----------------
Option Explicit
Dim hDevNotify As Long
Private Sub Form_Load()
Call DoRegisterDeviceInterface(
glngPrevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf MyWindowProc
End Sub
Private Sub Form_Unload(Cancel As Integer)
If hDevNotify <> 0 Then
Call UnregisterDeviceNotificati
End If
'pass control back to previous windows
SetWindowLong Me.hWnd, GWL_WNDPROC, glngPrevWndProc
End Sub
Sure. Look at this link:
http://support.microsoft.c
Whoops. This one also it is on the link above too
http://support.microsoft.c
Business Accounts
Answer for Membership
by: mirtheilPosted on 2005-09-11 at 07:07:48ID: 14859085
Should be something like:
Public Declare Function ConnectedDevices lib "DLLName.DLL" (bDeviceArrary as Boolean) as Boolean
Public Declare Function EnumerationType lib "DLLName.DLL" (iDeviceNum as long, bDeviceConnected as Boolean, iFirmWare as Long) as Boolean
(Can't try since I don't have the DLL)