【问题标题】:Pass a pointer in a win32 dll from vbscript (qtp)从 vbscript (qtp) 在 win32 dll 中传递一个指针
【发布时间】:2011-06-29 21:42:01
【问题描述】:

我有一个很好的老式 win32 dll,具有以下形式的功能

void Foo1(int* value)
void Foo2(char* string)
void Foo3(MyType* data)
//ect...

我需要在 QTP (vbscript) 中调用它并检索要在 QTP 应用程序中使用的数据。这在 vbscript 中是否可行?

我对 DLL 有一些控制权。它是用 C++ 编写的。构建 COM 服务器不是一种选择。重构代码以包含具有序数返回类型的访问器方法是完全不可能的(将是维护和可扩展性的噩梦)。

正在编辑以阐明示例...

我有……

void Add(int x, int y, int* result)

...我需要做与此等价的 QTP...

int myX = 2;
int myY = 5;
int myResult = -1;
Add(myX, myY, &myResult);
//myResult should now be 7

...但在 QTP 中。

在 QTP 中调用 int Bar(int x, int y) 很容易。
我需要知道是否可以拨打void Foo(int* result)
以这种方式Foo(&myResult) 并传入对结果的引用。

【问题讨论】:

  • 把这个放在这里......昨晚我的问题有了另一个答案,但它不再存在了。 ??您可以撤回关于 SO 的答案吗?它还在那里吗,我遗漏了一些明显的东西?

标签: winapi pointers dll vbscript qtp


【解决方案1】:

您可以声明像 Win32 API 这样的外部函数,但有一些限制,我相信该函数应该有extern "C" 链接并且并非所有类型都受支持。下面是一个如何使用 QTP 中的 Win32 GetParent 函数的示例,您也许可以推断出如何匹配自己的函数。

' Declare
Extern.Declare micHwnd, "GetParent", "user32.dll", "GetParent", micHwnd
' explanation:  retVal     name        sourceDll     name        parameter

' Usage
hwnd = Extern.GetParent(Browser(“xxx”).GetROProperty("hwnd"))

名称出现两次的原因是您可以为您的脚本重命名它(我不记得要查找的名称以及您将使用的名称)。

【讨论】:

  • 请参阅我的编辑/澄清。我需要调用 Foo(int* x) 并让它修改我在 QTP 中声明的 x。这可能吗?
【解决方案2】:

答案是通过引用传递。

在.h文件中声明函数:

extern "C" __declspec(dllexport) int HelloWorld(int &);

在.cpp文件中定义函数:

int HelloWorld(int& i)
{
    i = 10;
    return 55 + i;
}

QTP代码:

Extern.Declare micInteger, "HelloWorld", "C:\test.dll", "HelloWorld", micInteger+micByRef 
myNumber = 5
Extern.HelloWorld(myNumber)
MsgBox(myNumber)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 2021-11-02
    • 2021-11-27
    • 2016-11-04
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多