找回密码
 加入
搜索
查看: 2823|回复: 11

AU3如何得到变量、数组的指针(地址)

[复制链接]
发表于 2009-6-9 00:41:25 | 显示全部楼层 |阅读模式
本帖最后由 baikaifang 于 2009-8-11 12:59 编辑

调用API函数时,很多函数需要提供指针,在Visual C++ 中使用 "& 变量名"或"& 数组名"就可以取得指向变量或数据的指针,AU3如果调用这些API函数,该怎么弄啊!请大家指定下,谢谢!

// WinIoTest.cpp
#include <windows.h>
#include <stdio.h>
#include "winio.h"

void main()
{
  DWORD dwPortVal;
  DWORD dwMemVal;
  bool bResult;
  HANDLE hPhysicalMemory;
  PBYTE pbLinAddr;
  bResult = InitializeWinIo();

  if (bResult)
  {

    GetPortVal(0x378, &dwPortVal, 4);
    SetPortVal(0x378, 10, 4);
    pbLinAddr = MapPhysToLin((PBYTE)0xA0000, 65536, &hPhysicalMemory);

    if (pbLinAddr)
    {
      *pbLinAddr = 10;
      UnmapPhysicalMemory(hPhysicalMemory, pbLinAddr);
    }
    GetPhysLong((PBYTE)0xA0000, &dwMemVal);
    SetPhysLong((PBYTE)0xA0000, 10);
    ShutdownWinIo();
  }
  else
  {
    printf("Error during initialization of WinIo.\n");
    exit(1);
  }
}

---------------------------------------------------------------------------------------------------------

// Winio.h

#ifndef WINIO_H
#define WINIO_H

#ifdef WINIO_DLL
#define WINIO_API _declspec(dllexport)
#else
#define WINIO_API _declspec(dllimport)
#endif

extern "C"
{
  WINIO_API bool _stdcall InitializeWinIo();
  WINIO_API void _stdcall ShutdownWinIo();
  WINIO_API PBYTE _stdcall MapPhysToLin(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle);
  WINIO_API bool _stdcall UnmapPhysicalMemory(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr);
  WINIO_API bool _stdcall GetPhysLong(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
  WINIO_API bool _stdcall SetPhysLong(PBYTE pbPhysAddr, DWORD dwPhysVal);
  WINIO_API bool _stdcall GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
  WINIO_API bool _stdcall SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
  WINIO_API bool _stdcall InstallWinIoDriver(PSTR pszWinIoDriverPath, bool IsDemandLoaded = false);
  WINIO_API bool _stdcall RemoveWinIoDriver();
}

extern bool IsNT;
extern HANDLE hDriver;
extern bool IsWinIoInitialized;

bool _stdcall StartWinIoDriver();
bool _stdcall StopWinIoDriver();

#endif

-----------------------------------------------------------------------------------------------------------
上例中的函数 GetPortVal、MapPhysToLin、GetPhysLong,这些函数中的个别参数都使用了指针,不知道在AU3里面该怎么处理这种传递指针的参数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2009-6-9 00:50:15 | 显示全部楼层
不懂啊.....
发表于 2009-6-9 05:34:10 | 显示全部楼层
楼主贴个VC++的例子上来~
 楼主| 发表于 2009-6-9 10:42:10 | 显示全部楼层
楼主贴个VC++的例子上来~
pusofalse 发表于 2009-6-9 05:34


已经重新编辑贴子,将VC++的例子加上了。
发表于 2009-6-9 10:48:51 | 显示全部楼层
本帖最后由 pusofalse 于 2009-6-9 10:50 编辑

$iResult = DllCall("WinIo.dll", "int", "GetPortVal", "short", 0x378, "dword*", 0, "int", 4)
Msgbox(0, $iResult[0], $iResult[2])
发表于 2009-6-9 11:16:27 | 显示全部楼层
结构体使用DllStructGetPtr 得到指针,
变量及数组无法直接取得指针,
不过对于变量,你可以先建立一个struct,然后将这个变量作为member加入struct,再取得这个member的指针:
Global $iA = 16
Global $tagA = "int A"
Global $tA = DllStructCreate($tagA)
Global $ptA = DllStructGetPtr($tA)

; Set the data
DllStructSetData($tA, "A", $iA)

; Use the pointer to extract the data
MsgBox(64, "DLL Success Test", "A = " & DllStructGetData($tA, 1))
数组指针暂时无解
发表于 2009-6-9 11:30:57 | 显示全部楼层
贵宾好久不见了
发表于 2009-6-9 11:31:17 | 显示全部楼层
嘿嘿,又学了3个代码
 楼主| 发表于 2009-6-9 12:18:36 | 显示全部楼层
结构体使用DllStructGetPtr 得到指针,
变量及数组无法直接取得指针,
不过对于变量,你可以先建立一个struct,然后将这个变量作为member加入struct,再取得这个member的指针:Global $iA = 16
Global $tagA = "i ...
zcbenz 发表于 2009-6-9 11:16


谢谢指点,自己也去官网逛了一下,发现也只有这种方式了,暂时先不结贴,等等看下别的朋友有没有更好的方法。
发表于 2009-8-18 10:29:58 | 显示全部楼层
学习了,蛮有用的
发表于 2011-4-19 11:46:53 | 显示全部楼层
数组可否使用
ptr(array[$i])=ptr(array[0])+sizeof(data)*$i 实现
发表于 2012-3-29 18:29:22 | 显示全部楼层
用的.......................................
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-30 17:22 , Processed in 0.085109 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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