baikaifang 发表于 2009-6-9 00:41:25

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

本帖最后由 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里面该怎么处理这种传递指针的参数。

kn007 发表于 2009-6-9 00:50:15

不懂啊.....

pusofalse 发表于 2009-6-9 05:34:10

楼主贴个VC++的例子上来~

baikaifang 发表于 2009-6-9 10:42:10

楼主贴个VC++的例子上来~
pusofalse 发表于 2009-6-9 05:34 http://www.autoitx.com/images/common/back.gif

已经重新编辑贴子,将VC++的例子加上了。

pusofalse 发表于 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, $iResult)

zcbenz 发表于 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))数组指针暂时无解

kn007 发表于 2009-6-9 11:30:57

贵宾好久不见了

kn007 发表于 2009-6-9 11:31:17

嘿嘿,又学了3个代码

baikaifang 发表于 2009-6-9 12:18:36

结构体使用DllStructGetPtr 得到指针,
变量及数组无法直接取得指针,
不过对于变量,你可以先建立一个struct,然后将这个变量作为member加入struct,再取得这个member的指针:Global $iA = 16
Global $tagA = "i ...
zcbenz 发表于 2009-6-9 11:16 http://www.autoitx.com/images/common/back.gif

谢谢指点,自己也去官网逛了一下,发现也只有这种方式了,暂时先不结贴,等等看下别的朋友有没有更好的方法。

wangxi0414 发表于 2009-8-18 10:29:58

学习了,蛮有用的

klarkelou 发表于 2011-4-19 11:46:53

数组可否使用
ptr(array[$i])=ptr(array)+sizeof(data)*$i 实现

网店 发表于 2012-3-29 18:29:22

用的.......................................
页: [1]
查看完整版本: AU3如何得到变量、数组的指针(地址)