PowerBASIC Forums
  Source Code
  Hardware enumeration using SetupApi.dll

Post New Topic  Post A Reply
profile | register | preferences | faq | search

UBBFriend: Email This Page to Someone! next newest topic | next oldest topic
Author Topic:   Hardware enumeration using SetupApi.dll
Pierre Bellisle
Member
posted February 28, 2004 10:59 PM     Click Here to See the Profile for Pierre Bellisle     Edit/Delete Message   Reply w/Quote

'Code to find hardware info, minimum Win98 or Win2000 (No 95 or NT4)
'Use of the setupapi dll.
'Will find modem port for any modem, PCMCIA, WinModem etc...
'Will find infrared port devices, serial or parallel ...
'Will find USB, scanner, SCSI, display, mouse, keyboard, CDRom, HID, etc...
'Icon are from setupapi dll imagelist.

'Info about ClassName and ClassGUID: http://www.osr.com/ddk/install/setup-cls_2i1z.htm

'Have fun, Pierre

#COMPILE EXE '#Win702#
#DIM ALL
#REGISTER NONE
#INCLUDE "Win32Api.Inc" '#2003-10-27#

%Listbox1 = 101

%ClassName = 001
%GuidTxt = 002
%Friendly = 003
%DevDesc = 004
%DevDriver = 005
%PortName = 006

%DIGCF_DEFAULT = 001
%DIGCF_PRESENT = 002
%DIGCF_ALLCLASSES = 004
%DIGCF_PROFILE = 008
%DIGCF_DEVICEINTERFACE = 016

%MAX_CLASS_NAME_LEN = 128

%DIREG_DEV = 001
%DIREG_DRV = 002

%DICS_FLAG_GLOBAL = 001
%DICS_FLAG_CONFIGSPECIFIC = 002

%SPDRP_DEVICEDESC = 000
%SPDRP_HARDWAREID = 001
%SPDRP_COMPATIBLEIDS = 002
%SPDRP_SERVICE = 004
%SPDRP_CLASS = 007
%SPDRP_CLASSGUID = 008
%SPDRP_DRIVER = 009
%SPDRP_CONFIGFLAGS = 010
%SPDRP_MFG = 011
%SPDRP_FRIENDLYNAME = 012
%SPDRP_LOCATION_INFORMATION = 013
%SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 014
%SPDRP_CAPABILITIES = 015
%SPDRP_UI_NUMBER = 016
%SPDRP_UPPERFILTERS = 017
%SPDRP_LOWERFILTERS = 018
%SPDRP_BUSTYPEGUID = 019
%SPDRP_LEGACYBUSTYPE = 020
%SPDRP_BUSNUMBER = 021
%SPDRP_ENUMERATOR_NAME = 022
%SPDRP_SECURITY = 023
%SPDRP_SECURITY_SDS = 024
%SPDRP_DEVTYPE = 025
%SPDRP_EXCLUSIVE = 026
%SPDRP_CHARACTERISTICS = 027
%SPDRP_ADDRESS = 028
%SPDRP_UI_NUMBER_DESC_FORMAT = 030

TYPE SP_CLASSIMAGELIST_DATA
cbSize AS DWORD
hImageList AS DWORD
Reserved AS DWORD
END TYPE

TYPE SP_DEVINFO_DATA
cbSize AS DWORD
ClassGuid AS GUIDAPI
DevInst AS DWORD
Reserved AS DWORD
END TYPE

TYPE SP_DEVICE_INTERFACE_DATA
cbSize AS DWORD
InterfaceClassGuid AS GUIDAPI
Flags AS DWORD
Reserved AS DWORD PTR
END TYPE

TYPE SP_DEVICE_INTERFACE_DETAIL_DATA
cbSize AS DWORD
DevicePath AS ASCIIZ * 512
END TYPE

DECLARE FUNCTION SetupDiLoadClassIcon LIB "setupapi.dll" ALIAS "SetupDiLoadClassIcon" _
(BYREF ClassGuid AS GUIDAPI, _
BYREF hIconBig AS DWORD , _
BYREF ImageIndex AS LONG) AS LONG

DECLARE FUNCTION SetupDiGetClassImageList LIB "setupapi.dll" ALIAS "SetupDiGetClassImageList" _
(BYREF ClassImageListData AS SP_CLASSIMAGELIST_DATA) AS LONG

DECLARE FUNCTION SetupDiGetClassImageListEx LIB "setupapi.dll" ALIAS "SetupDiGetClassImageListExA" _
(BYREF ClassImageListData AS SP_CLASSIMAGELIST_DATA, _
MachineName AS ASCIIZ , _
BYVAL Reserved AS DWORD) AS LONG

DECLARE FUNCTION SetupDiDestroyClassImageList LIB "setupapi.dll" ALIAS "SetupDiDestroyClassImageList" _
(BYREF ClassImageListData AS SP_CLASSIMAGELIST_DATA) AS LONG

DECLARE FUNCTION SetupDiGetClassImageIndex LIB "setupapi.dll" ALIAS "SetupDiGetClassImageIndex" _
(BYREF ClassImageListData AS SP_CLASSIMAGELIST_DATA, _
BYREF ClassGuid AS GUIDAPI, _
BYVAL ImageIndex AS LONG POINTER) AS LONG 'Use VARPTR(ImageIndex)

DECLARE FUNCTION SetupDiOpenClassRegKey LIB "Setupapi.dll" ALIAS "SetupDiOpenClassRegKey" _
(BYREF ClassGuidList AS GUIDAPI, _
BYREF samDesired AS DWORD) AS LONG

DECLARE FUNCTION SetupDiOpenClassRegKeyEx LIB "Setupapi.dll" ALIAS "SetupDiOpenClassRegKeyExA" _
(BYREF ClassGuidList AS GUIDAPI, _
BYREF samDesired AS DWORD , _
BYREF Flags AS DWORD , _
MachineName AS ASCIIZ , _
BYREF Reserved AS DWORD) AS LONG

DECLARE FUNCTION SetupDiEnumDeviceInfo LIB "Setupapi.dll" ALIAS "SetupDiEnumDeviceInfo" _
(BYVAL hDeviceInfoSet AS DWORD, _
BYVAL MemberIndex AS DWORD, _
BYREF DeviceInfoData AS SP_DEVINFO_DATA) AS LONG

DECLARE FUNCTION SetupDiClassGuidsFromName LIB "Setupapi.dll" ALIAS "SetupDiClassGuidsFromNameA" _
( ClassName AS ASCIIZ , _
BYREF ClassGuidList AS GUIDAPI, _
BYREF ClassGuidListSize AS DWORD , _
BYREF RequiredSize AS DWORD) AS LONG

DECLARE FUNCTION SetupDiClassNameFromGuid LIB "Setupapi.dll" ALIAS "SetupDiClassNameFromGuidA" _
(BYREF ClassGuid AS GUIDAPI, _
ClassName AS ASCIIZ , _
BYVAL ClassNameSize AS DWORD , _
BYREF RequiredSize AS DWORD) AS LONG

DECLARE FUNCTION SetupDiGetClassDevs LIB "Setupapi.dll" ALIAS "SetupDiGetClassDevsA" _
(BYREF ClassGuid AS GUIDAPI, _
Enumerator AS ASCIIZ , _
BYVAL hwndParent AS DWORD , _
BYVAL Flags AS DWORD) AS DWORD

DECLARE FUNCTION SetupDiEnumDeviceInterfaces LIB "Setupapi.dll" ALIAS "SetupDiEnumDeviceInterfaces" _
(BYVAL hDeviceInfoSet AS DWORD , _
BYREF DeviceInfoData AS SP_DEVINFO_DATA, _
BYREF InterfaceClassGuid AS GUIDAPI , _
BYVAL MemberIndex AS DWORD , _
BYREF DeviceInterfaceData AS SP_DEVICE_INTERFACE_DATA) AS LONG

DECLARE FUNCTION SetupDiGetDeviceRegistryProperty LIB "setupapi.dll" ALIAS "SetupDiGetDeviceRegistryPropertyA" _
(BYVAL hDeviceInfoSet AS DWORD , _
BYREF DeviceInfoData AS SP_DEVINFO_DATA, _
BYVAL Property AS LONG , _
BYREF PropertyRegDataType AS LONG , _
PropertyBuffer AS ASCIIZ , _
BYVAL PropertyBufferSize AS DWORD , _
BYREF RequiredSize AS DWORD) AS LONG

DECLARE FUNCTION SetupDiGetDeviceInterfaceDetail LIB "Setupapi.dll" ALIAS "SetupDiGetDeviceInterfaceDetailA" _
(BYVAL hDeviceInfoSet AS DWORD , _
BYREF DeviceInterfaceData AS SP_DEVICE_INTERFACE_DATA , _
BYREF DeviceInterfaceDetailData AS SP_DEVICE_INTERFACE_DETAIL_DATA, _
BYVAL DeviceInterfaceDetailDataSize AS DWORD , _
BYREF RequiredSize AS DWORD , _
BYREF DeviceInfoData AS SP_DEVINFO_DATA) AS LONG

DECLARE FUNCTION SetupDiDestroyDeviceInfoList LIB "Setupapi.dll" ALIAS "SetupDiDestroyDeviceInfoList" _
(BYVAL hDeviceInfoSet AS DWORD) AS LONG

DECLARE FUNCTION SetupDiOpenDevRegKey LIB "Setupapi.dll" ALIAS "SetupDiOpenDevRegKey" _
(BYVAL hDeviceInfoSet AS DWORD , _
BYREF DeviceInfoData AS SP_DEVINFO_DATA, _
BYVAL Scope AS DWORD , _
BYVAL HwProfile AS DWORD , _
BYVAL KeyType AS DWORD , _
BYREF samDesired AS DWORD) AS LONG

DECLARE FUNCTION SetupDiOpenDeviceInterfaceRegKey LIB "Setupapi.dll" ALIAS "SetupDiOpenDeviceInterfaceRegKey" _
(BYVAL hDeviceInfoSet AS DWORD , _
BYREF DeviceInterfaceData AS SP_DEVICE_INTERFACE_DATA, _
BYVAL Reserved AS DWORD , _
BYVAL samDesired AS DWORD) AS LONG

'______________________________________________________________________________

FUNCTION GetDeviceInfo(Device AS STRING, InfoArray() AS STRING) AS LONG
LOCAL zClassName AS ASCIIZ * %MAX_CLASS_NAME_LEN
LOCAL DevName AS ASCIIZ * %MAX_CLASS_NAME_LEN
LOCAL PortName AS ASCIIZ * %MAX_CLASS_NAME_LEN
LOCAL DevDesc AS ASCIIZ * %MAX_CLASS_NAME_LEN
LOCAL DevDriver AS ASCIIZ * %MAX_CLASS_NAME_LEN
LOCAL DeviceInterfaceData AS SP_DEVICE_INTERFACE_DATA
LOCAL DeviceInfoData AS SP_DEVINFO_DATA
LOCAL hDeviceInfoSet AS DWORD
LOCAL RequiredSize AS DWORD
LOCAL hKeyDevice AS DWORD
LOCAL HwProfile AS DWORD
LOCAL PropertyRegDataType AS DWORD
LOCAL DevCount AS LONG
LOCAL Retval AS LONG
LOCAL DeviceCount AS LONG
LOCAL Counter AS LONG

FOR Counter = 1 TO PARSECOUNT(Device, "/")
zClassName = PARSE$(Device, "/", Counter)
DevCount = 0

Retval = SetupDiClassGuidsFromName(zClassName, BYVAL 0, BYVAL 0, RequiredSize)
IF RequiredSize THEN
REDIM GuidArray(1 TO RequiredSize) AS GUIDAPI
Retval = SetupDiClassGuidsFromName(zClassName, GuidArray(1), _
SIZEOF(GUIDAPI) * RequiredSize, RequiredSize)
ELSE
ITERATE
END IF

'Get info by ClassGUID, like GUID$("{4D36E978E325-11CE-BFC1-08002BE10318})" for "Ports"
hDeviceInfoSet = SetupDiGetClassDevs(GuidArray(1), BYVAL %NULL, BYVAL %NULL, %DIGCF_PRESENT)

'Get info by registry keyname like "FLOP" in "HKEY_LOCAL_MACHINE\Enum\FLOP"
'zBuffer = "Flop" 'For floppy
'hDeviceInfoSet = SetupDiGetClassDevs(byval %NULL, zBuffer, BYVAL %NULL, %DIGCF_PRESENT OR %DIGCF_ALLCLASSES)

'List all devices
'hDeviceInfoSet = SetupDiGetClassDevs(byval %NULL, BYVAL %NULL, BYVAL %NULL, %DIGCF_PRESENT OR %DIGCF_ALLCLASSES)

IF hDeviceInfoSet = %INVALID_HANDLE_VALUE THEN ITERATE
DeviceInfoData.cbSize = SIZEOF(DeviceInfoData)
DeviceInterfaceData.CbSize = SIZEOF(DeviceInterfaceData)

DO 'Loop to get all devices of a class

'Get a device based on DevCount, exit if no more
Retval = SetupDiEnumDeviceInfo(hDeviceInfoSet, DevCount, DeviceInfoData) 'Return True if success
IF Retval = 0 THEN EXIT DO 'Exit, last device

INCR DeviceCount
REDIM PRESERVE InfoArray(1 TO 6, 1 TO DeviceCount)

InfoArray(%ClassName, DeviceCount) = zClassName
InfoArray(%GuidTxt, DeviceCount) = GUIDTXT$(GuidArray(1))

'Get data in DevName
DevName = "None"
Retval = SetupDiGetDeviceRegistryProperty( _
hDeviceInfoSet , _ 'Return True if success
DeviceInfoData , _
%SPDRP_FRIENDLYNAME , _ 'Like FRIENDLYNAME
PropertyRegDataType , _
DevName , _ 'What we need, like Communication port (COM1)
SIZEOF(DevName) , _
RequiredSize)
InfoArray(%Friendly, DeviceCount) = DevName

DevDesc = "None"
Retval = SetupDiGetDeviceRegistryProperty( _
hDeviceInfoSet , _ 'Return True if success
DeviceInfoData , _
%SPDRP_DEVICEDESC , _ 'Like FRIENDLYNAME
PropertyRegDataType , _
DevDesc , _ 'What we need, like Communication port (COM1)
SIZEOF(DevDesc) , _
RequiredSize)
InfoArray(%DevDesc, DeviceCount) = DevDesc

DevDriver = "None"
Retval = SetupDiGetDeviceRegistryProperty( _
hDeviceInfoSet , _ 'Return True if success
DeviceInfoData , _
%SPDRP_DRIVER , _ 'Like FRIENDLYNAME
PropertyRegDataType , _
DevDriver , _ 'What we need, like Communication port (COM1)
SIZEOF(DevDriver) , _
RequiredSize)
InfoArray(%DevDriver, DeviceCount) = DevDriver

'Get DeviceInterfaceData, needed for SetupDiOpenDevRegKey
Retval = SetupDiEnumDeviceInterfaces( _
hDeviceInfoSet , _ 'Return True if success
DeviceInfoData , _
GuidArray(1) , _
DevCount , _
DeviceInterfaceData)

'Get a handle to the current registry, where device was found
hKeyDevice = SetupDiOpenDevRegKey( _
hDeviceInfoSet , _
DeviceInfoData , _
%DICS_FLAG_GLOBAL , _ ' %DICS_FLAG_CONFIGSPECIFIC - %DICS_FLAG_GLOBAL
HwProfile , _
%DIREG_DEV , _ ' %DIREG_DEV - %DIREG_DRV
%KEY_QUERY_VALUE)

'Get extra info if needed, like "PortName"
PortName = "None"
Retval = RegQueryValueEx( _
hKeyDevice , _ 'Handle of key to query
BYCOPY "portname" , _ 'Address of name of value to query
BYVAL %NULL , _ 'Reserved
BYVAL %NULL , _ 'Address of buffer for value type
PortName , _ 'Address of data buffer
SIZEOF(PortName)) 'Address of data buffer size
RegCloseKey hKeyDevice
InfoArray(%PortName, DeviceCount) = PortName

INCR DevCount
LOOP

IF hDeviceInfoSet THEN SetupDiDestroyDeviceInfoList hDeviceInfoSet : hDeviceInfoSet = 0

NEXT

FUNCTION = DeviceCount

END FUNCTION
'______________________________________________________________________________

CALLBACK FUNCTION DlgProc
STATIC ClassImageListData AS SP_CLASSIMAGELIST_DATA
LOCAL lpdis AS DRAWITEMSTRUCT PTR
LOCAL zClassName AS ASCIIZ * %MAX_CLASS_NAME_LEN
LOCAL zTxt AS ASCIIZ * 300
LOCAL zBuf AS ASCIIZ * 300
LOCAL GuidInfo AS GUIDAPI
LOCAL rc AS RECT
LOCAL Counter AS LONG
LOCAL DeviceCount AS LONG
LOCAL itd AS LONG
LOCAL Retval AS LONG
STATIC hList AS DWORD
STATIC hImageList AS DWORD
LOCAL hIcon AS DWORD
LOCAL ImageIndex AS DWORD
LOCAL RequiredSize AS DWORD
LOCAL CurPos AS DWORD
LOCAL Device AS STRING
DIM InfoArray(1 TO 6, 1 TO 1) AS STRING

SELECT CASE CBMSG
CASE %WM_INITDIALOG
ClassImageListData.cbSize = SIZEOF(ClassImageListData)
SetupDiGetClassImageList ClassImageListData
hImageList = ClassImageListData.hImageList

CONTROL HANDLE CBHNDL, %Listbox1 TO hList
CONTROL SEND CBHNDL, %Listbox1, %LB_SETITEMHEIGHT, 0, 20
'Counter = 50
'CALL SendMessage(hList, %LB_SETTABSTOPS, 1, VARPTR(Counter))
CONTROL SEND CBHNDL, %LISTBOX1, %LB_SETHORIZONTALEXTENT, 1200, 0

Device = "Modem/Ports/Printer/PnPPrinters/ScsiAdapter/Display/Mouse/Monitor/Keyboard/"
Device = Device & "CDRom/Infrared/PCMCIA/USB/GPS/DiskDrive/HDC/FDC/FloppyDisk/1394/"
Device = Device & "Adapter/Media/MTD/MultiFunction/Image/Net/NetClient/NetService/"
Device = Device & "NetTrans/HID/DBC/SBP2/System/MediumChanger/MultiportSerialProcessor/"
Device = Device & "SmartCardReader/TapeDrive/Volume"

'The complete list
'Device = "1394/1394debug/61883/adapter/apmsupport/avc/battery/biometric/" & _
' "bluetooth/cdrom/computer/decoder/diskdrive/display/" & _
' "dot4print/enum1394/fdc/floppydisk/gps/hdc/hidclass/image/" & _
' "infrared/keyboard/legacydriver/media/mediumchanger/mtd/modem/" & _
' "monitor/mouse/multifunction/multiportserial/net/netclient/" & _
' "netservice/nettrans/nodriver/pcmcia/ports/printer/" & _
' "printer upgrade/pnpprinters/processor/sbp2/scsiadapter/" & _
' "security accelerator/smartcardreader/sound/system/tapedrive/" & _
' "unknown/usb/volume/volumesnapshot/wceusbs"

'Device = "Ports/Modem/Printer" 'Try this
'Device = "Modem" 'or this
'Device = "Ports" 'or this...
'Device = "Infrared" 'or this...
'Device = "Image" 'or this...

'The next function will return an hardware description array based on the device string
DeviceCount = GetDeviceInfo(Device, InfoArray())

'Fill listbox with data and icon
LISTBOX ADD CBHNDL, %Listbox1, "DeviceCount: " & $TAB & FORMAT$(DeviceCount)
LISTBOX ADD CBHNDL, %Listbox1, STRING$(75, "-")
CurPos = 2
FOR Counter = 1 TO DeviceCount
zClassName = InfoArray(%ClassName, Counter)
Retval = SetupDiClassGuidsFromName(zClassName, GuidInfo, SIZEOF(GuidInfo) , RequiredSize)
Retval = SetupDiLoadClassIcon(GuidInfo, hIcon, ImageIndex )
LISTBOX ADD CBHNDL, %Listbox1, "Class: " & $TAB & InfoArray(%ClassName, Counter)
CONTROL SEND CBHNDL, %Listbox1, %LB_SETITEMDATA, CurPos, hIcon
LISTBOX ADD CBHNDL, %Listbox1, "Guid: " & $TAB & InfoArray(%GuidTxt, Counter)
LISTBOX ADD CBHNDL, %Listbox1, "FriendlyName: " & $TAB & InfoArray(%Friendly, Counter)
LISTBOX ADD CBHNDL, %Listbox1, "Description: " & $TAB & InfoArray(%DevDesc, Counter)
LISTBOX ADD CBHNDL, %Listbox1, "Driver: " & $TAB & InfoArray(%DevDriver, Counter)
LISTBOX ADD CBHNDL, %Listbox1, "PortName: " & $TAB & InfoArray(%PortName, Counter)
LISTBOX ADD CBHNDL, %Listbox1, STRING$(75, "-")
CurPos = CurPos + 7
NEXT

CASE %WM_SIZE
MoveWindow hList, 0, 0, LOWRD(CBLPARAM), HIWRD(CBLPARAM), %TRUE
FUNCTION = 0: EXIT FUNCTION

CASE %WM_COMMAND
SELECT CASE LOWRD(CBWPARAM)
CASE %IDCANCEL : DIALOG END CBHNDL, 0
END SELECT

CASE %WM_DESTROY
IF ClassImageListData.hImageList THEN
SetupDiDestroyClassImageList ClassImageListData
END IF

CASE %WM_DRAWITEM, %WM_MEASUREITEM 'Thank's to Borje
IF CBWPARAM = %Listbox1 THEN
lpdis = CBLPARAM
IF @lpdis.itemID = &HFFFFFFFF THEN EXIT FUNCTION

SELECT CASE @lpdis.itemAction
CASE %ODA_DRAWENTIRE, %ODA_SELECT
'CLEAR BACKGROUND
IF (@lpdis.itemState AND %ODS_SELECTED) = 0 THEN 'if not selected
FillRect @lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_WINDOW) 'clear background
CALL SetBkColor(@lpdis.hDC, GetSysColor(%COLOR_WINDOW)) 'text background
CALL SetTextColor(@lpdis.hDC, GetSysColor(%COLOR_WINDOWTEXT)) 'text color
ELSE
FillRect @lpdis.hDC, @lpdis.rcItem, GetSysColorBrush(%COLOR_HIGHLIGHT) 'clear background
CALL SetBkColor(@lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHT)) 'text background
CALL SetTextColor(@lpdis.hDC, GetSysColor(%COLOR_HIGHLIGHTTEXT)) 'text color
END IF

'DRAW TEXT
CALL SendMessage(GetDlgItem(CBHNDL, %Listbox1), %LB_GETTEXT, @lpdis.itemID, VARPTR(zTxt)) 'Get text
rc = @lpdis.rcItem
rc.nLeft = 35
zBuf = LEFT$(zTxt, INSTR(zTxt, $TAB) - 1)
CALL DrawText(@lpdis.hDC, zBuf, LEN(zBuf), rc, %DT_SINGLELINE OR %DT_LEFT OR %DT_VCENTER)
zBuf = MID$(zTxt, INSTR(zTxt, $TAB) + 1)
rc.nLeft = rc.nLeft + 75
CALL DrawText(@lpdis.hDC, zBuf, LEN(zBuf), rc, %DT_SINGLELINE OR %DT_LEFT OR %DT_VCENTER)

'DRAW ICON
itd = SendMessage(GetDlgItem(CBHNDL, %Listbox1), %LB_GETITEMDATA, @lpdis.itemID, 0)
IF itd THEN
CALL DrawIconEx(@lpdis.hDC, @lpdis.rcItem.nLeft + 3, @lpdis.rcItem.ntop + 1, _
itd, 18, 18, 0, 0, %DI_NORMAL)
END IF
FUNCTION = %TRUE : EXIT FUNCTION

END SELECT

END IF
FUNCTION = 0: EXIT FUNCTION

END SELECT
END FUNCTION
'______________________________________________________________________________

FUNCTION PBMAIN
LOCAL hDlg AS DWORD

DIALOG NEW 0, "Hardware devices enumeration", , , 350, 300, _
%WS_OVERLAPPEDWINDOW OR %DS_MODALFRAME, 0 TO hDlg

CONTROL ADD LISTBOX, hDlg, %Listbox1,, 5, 5, 340, 290, %WS_CHILD OR %WS_VISIBLE OR %LBS_NOTIFY OR _
%WS_TABSTOP OR %WS_HSCROLL OR %WS_VSCROLL OR %Lbs_UseTabStops OR %LBS_OWNERDRAWFIXED _
OR %LBS_HASSTRINGS, %WS_EX_CLIENTEDGE

DIALOG SHOW MODAL hDlg CALL DlgProc

END FUNCTION
'______________________________________________________________________________


[This message has been edited by Pierre Bellisle (edited January 20, 2005).]

IP: Logged

All times are EasternTime (US)

next newest topic | next oldest topic

Administrative Options: Close Topic | Archive/Move | Delete Topic
Post New Topic  Post A Reply
Hop to:

Contact Us | PowerBASIC BASIC Compilers

Copyright © 1999-2005 PowerBASIC, Inc. All Rights Reserved.


Ultimate Bulletin Board 5.45c