仙乃日 发表于 2010-7-25 17:29:41

学习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)的写法最适合。

仙乃日 发表于 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 编辑

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:48

大圣,好久不见了,这些资料应该好好整理,然后开一个封装专题.

仙乃日 发表于 2010-7-27 09:32:03

大圣,好久不见了,这些资料应该好好整理,然后开一个封装专题.
ceoguang 发表于 2010-7-26 22:06 http://www.autoitx.com/images/common/back.gif


    自己来这论坛的主要目的是向各位大大学习。努力灌水提高权限……

pusofalse 发表于 2010-7-28 02:35:01

学习了,很用心的总结。

hzxymkb 发表于 2010-7-28 10:56:54

我来支持一下高人!学习一下高人的精华!谢谢高人!

pp88298 发表于 2010-7-28 11:21:30

新手学习回帖 谢谢

苦涩的咖啡 发表于 2010-7-28 15:34:16

{:face (125):}学习学习

卫和谐 发表于 2010-7-31 21:01:24

之前,不知道还可以这样显示提示框的!

0633zhou 发表于 2010-8-1 21:52:46

还是看不明白啊,基础太差了啊

itboy 发表于 2010-8-2 21:27:41

好贴,绝对值得认真学习。再次谢谢楼主

xiayier 发表于 2010-8-3 11:14:25

收走收走~~~

liufenglg 发表于 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,随同当前时间载入的结构

希望多作些这方面的总结,方便我们新手
页: [1] 2 3 4
查看完整版本: 学习dllcall啦……