找回密码
 加入
搜索
查看: 28141|回复: 55

[原创] 学习dllcall啦……

[复制链接]
发表于 2010-7-25 17:29:41 | 显示全部楼层 |阅读模式
本帖最后由 仙乃日 于 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)的写法最适合。

评分

参与人数 4金钱 +80 贡献 +23 收起 理由
zps26 + 20
小菜kks + 8 收走啦,努力学习当中
Duvet + 30 + 5
pusofalse + 30 + 10 学习了。

查看全部评分

 楼主| 发表于 2010-7-25 17:30:37 | 显示全部楼层
变量转换的例子
$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:04:59 | 显示全部楼层
本帖最后由 仙乃日 于 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-26 21:02:24 | 显示全部楼层
本帖最后由 仙乃日 于 2010-7-27 09:35 编辑

UpdateDriverForPlugAndPlayDevices
BOOLWINAPI  UpdateDriverForPlugAndPlayDevices(    IN HWND  hwndParent  OPTIONAL,    IN LPCTSTR  HardwareId,    IN LPCTSTR  FullInfPath,    IN DWORD  InstallFlags,    OUT PBOOL  bRebootRequired  OPTIONAL    );
自己写的dllcall
Dim $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 
Next
P版写的:
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[5], $iResult[0])
EndFunc        ;==>_CM_Update_PnP_Device
3种略有不同的写法,自己测试均能正常工作。
发表于 2010-7-26 22:06:48 | 显示全部楼层
大圣,好久不见了,这些资料应该好好整理,然后开一个封装专题.
 楼主| 发表于 2010-7-27 09:32:03 | 显示全部楼层
大圣,好久不见了,这些资料应该好好整理,然后开一个封装专题.
ceoguang 发表于 2010-7-26 22:06



    自己来这论坛的主要目的是向各位大大学习。努力灌水提高权限……
发表于 2010-7-28 10:56:54 | 显示全部楼层
我来支持一下高人!学习一下高人的精华!谢谢高人!
发表于 2010-7-28 11:21:30 | 显示全部楼层
新手学习  回帖 谢谢
发表于 2010-7-28 15:34:16 | 显示全部楼层
学习学习
发表于 2010-7-28 02:35:01 | 显示全部楼层
学习了,很用心的总结。
发表于 2010-7-31 21:01:24 | 显示全部楼层
之前,不知道还可以这样显示提示框的!
发表于 2010-8-1 21:52:46 | 显示全部楼层
还是看不明白啊,基础太差了啊
发表于 2010-8-2 21:27:41 | 显示全部楼层
好贴,绝对值得认真学习。再次谢谢楼主
发表于 2010-8-3 11:14:25 | 显示全部楼层
收走收走~~~
发表于 2010-8-13 11:08:29 | 显示全部楼层
本帖最后由 liufenglg 于 2010-10-5 10:41 编辑

正要学习,现在看着好难啊

  Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime As SYSTEMTIME)  
 说明  :
 在一个SYSTEMTIME中载入当前系统时间,这个时间采用的是“协同世界时间”(即UTC,也叫做GMT)格式
  参数表   参数 类型及说明  
 lpSystemTime SYSTEMTIME,随同当前时间载入的结构

希望多作些这方面的总结,方便我们新手
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 17:32 , Processed in 0.082498 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表