2011-06-29 73 views
3

我與形式的功能良好的老式的Win32 DLL傳遞一個指針

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

我需要在QTP(VBScript)來調用這個和retreive的數據用於QTP應用程序。這甚至可能在VBScript?

我對DLL有一些控制權。它是用C++編寫的。建立一個COM服務器不是一個選項。重構代碼以包含具有順序返回類型的訪問器方法是完全沒有問題的(將是維護和scabaility噩夢)。

編輯澄清的例子...

我有...

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)並傳遞參考結果。

+0

把這個到這裏。 ..昨晚我的問題還有另一個答案,但現在不存在了。 ??你能回收SO嗎?它仍然在那裏,我錯過了明顯的東西? – dFlat

回答

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) 
2

您可以聲明外部函數,如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")) 

的名字出現了兩次的原因是這樣你就可以將其重命名爲您的腳本(我不記得這是看的名稱和它是將要使用的名稱)。

+0

請參閱我的編輯/澄清。我需要調用Foo(int * x)並讓它修改一個x我在QTP中聲明的。這可能嗎? – dFlat