学习dllcall啦……
本帖最后由 仙乃日 于 2010-7-26 21:32 编辑DllCall ( "dll", "返回值类型", "函数名称" [, "类型1", 参数1[, "类型n", 参数n]] )
"返回值类型":除非API函数明确规定了参数类型必须为某类型。不然的话int、long、BOOL、UINT、ULONG、DWORD、ptr、HWND、HANDLE、float可以替用,都是占用4字节。
同样short、USHORT、WORD也可替用。INT64、UINT64、double也行。在字节相等的情况下,一般可以选用别的参数类型,不过最好是按API的参数类型来写。DllCall("user32.dll","int","MessageBoxW","hwnd",0,"wstr","欢迎学习DLLCall!","wstr","例子1","uint",0)
DllCall("user32.dll","long","MessageBoxW","hwnd",0,"wstr","欢迎学习DLLCall!","wstr","例子2","ULONG",0)
DllCall("user32.dll","BOOL","MessageBoxW","hwnd",0,"wstr","欢迎学习DLLCall!","wstr","例子3","HWND",0)
DllCall("user32.dll","DWORD","MessageBoxW","hwnd",0,"wstr","欢迎学习DLLCall!","wstr","例子4","HANDLE",0)
DllCall("user32.dll","float","MessageBoxW","hwnd",0,"wstr","欢迎学习DLLCall!","wstr","例子5","ptr",0)MessageBoxW定义WINUSERAPI int WINAPI MessageBoxW (HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) 所以dllcall("user32.dll","int","MessageBoxW","hwnd",0,"wstr","欢迎学习DLLCall!","wstr","例子1","uint",0)的写法最适合。 变量转换的例子$SYSTEMTIME=DllStructCreate("ushort wYear;ushort wMonth;ushort wDayOfWeek;ushort wDay;ushort wHour;ushort wMinute;ushort wSecond;ushort wMilliseconds")
DllCall("Kernel32.dll","none","GetSystemTime","ptr",DllStructGetPtr($SYSTEMTIME))
MsgBox(0,"Current time:",DllStructGetData($SYSTEMTIME,"wHour")&":"&DllStructGetData($SYSTEMTIME,"wMinute")) 本帖最后由 仙乃日 于 2010-7-26 20:06 编辑
如何理解LPCTSTR类型? L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。 P表示这是一个指针 C表示是一个常量 T表示在Win32环境中, 有一个_T宏
LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
LPSTR:32bit指针 指向一个字符串,每个字符占1字节
LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义 本帖最后由 仙乃日 于 2010-7-27 09:35 编辑
UpdateDriverForPlugAndPlayDevicesBOOLWINAPIUpdateDriverForPlugAndPlayDevices( IN HWNDhwndParentOPTIONAL, IN LPCTSTRHardwareId, IN LPCTSTRFullInfPath, IN DWORDInstallFlags, OUT PBOOLbRebootRequiredOPTIONAL );
自己写的dllcallDim $DeviceID,$InfPath,$iFlags
$DeviceID="pci\cc_0101"
$InfPath=@WindowsDir&"\inf\mshdc.inf"
$iFlags=5
DllCall("newdev.dll", "bool", "UpdateDriverForPlugAndPlayDevices", "hWnd", 0,"str", $DeviceID, "str", $InfPath, "dword", $iFlags, "bool*", 0)某位大大写的:For $i= 1 to 10
$varIdeRootkey="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}"
$varsubkey = RegEnumKey($varIdeRootkey, $i)
If @error <> 0 then ExitLoop
$varMatchingID=RegRead ($varIdeRootkey &"\"&$varsubkey , "MatchingDeviceId" )
if $varMatchingID="" Then ContinueLoop
if $varMatchingID="pci\cc_0101" then ContinueLoop
if StringInStr($varMatchingID,"pci\") then
$varMsHdcInfFile=@WindowsDir&"\inf\mshdc.inf"
$ret=DllCall("newdev.dll","int","UpdateDriverForPlugAndPlayDevices","int",0,"str",$varMatchingID,"str",$varMsHdcInfFile,"int",5,"int",0)
MsgBox(4096,"DS",$varMatchingID & "---" &$varMsHdcInfFile & "---" & $ret) ;经百度确认,这里的写法是有点小问题的。
endif
NextP版写的:Func _CM_Update_PnP_Device($sDeviceID, $sInfPath, $iFlags, $hWnd = 0)
Local $iResult
$iResult = DllCall($NEWDEV_DllHandle, "int", "UpdateDriverForPlugAndPlayDevices", "hWnd", $hWnd, _
"str", $sDeviceID, "str", $sInfPath, "dword", $iFlags, "int*", 0)
Return SetError(_CM_Get_Last_Error(), $iResult, $iResult)
EndFunc ;==>_CM_Update_PnP_Device3种略有不同的写法,自己测试均能正常工作。 大圣,好久不见了,这些资料应该好好整理,然后开一个封装专题. 大圣,好久不见了,这些资料应该好好整理,然后开一个封装专题.
ceoguang 发表于 2010-7-26 22:06 http://www.autoitx.com/images/common/back.gif
自己来这论坛的主要目的是向各位大大学习。努力灌水提高权限…… 我来支持一下高人!学习一下高人的精华!谢谢高人! 新手学习回帖 谢谢 {:face (125):}学习学习 学习了,很用心的总结。 之前,不知道还可以这样显示提示框的! 还是看不明白啊,基础太差了啊 好贴,绝对值得认真学习。再次谢谢楼主 收走收走~~~ 本帖最后由 liufenglg 于 2010-10-5 10:41 编辑
正要学习,现在看着好难啊
Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime As SYSTEMTIME)
说明 :
在一个SYSTEMTIME中载入当前系统时间,这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式
参数表 参数 类型及说明
lpSystemTime SYSTEMTIME,随同当前时间载入的结构
希望多作些这方面的总结,方便我们新手