程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 調用外部Dll的點點滴滴

調用外部Dll的點點滴滴

編輯:關於C#
 

調用外部DLL的方法有兩種:

1. (單個腳本中)在腳本中是使用 lr_load_dll 函數。

2. (全局設置,所有腳本)通過修改 mdrv.dat 文件實現。

對DLL的要求 VuGen只能識別標准C編譯的DLL, 所以使用VC6創建的函數必須在函數開頭加上extern "C",它告訴編譯器對這個函數按照標准C的方式進行編譯。而如果你想調用C#編譯出來DLL,那就只能望而卻步啦。如何想查看DLL中是否有符合要求的導出函數,可以使用微軟的SDK裡自帶的Dependency Walker工具。

DLL的創建 啟動VC6,新建一個Win32 Dynamic-Link Library的工程,取名:LRDllTest
在這裡,我們創建一個簡單的求和函數Sum,並什麼為導出函數,關鍵代碼如下:

#define LRDLLTEST_API __declspec(dllexport)
extern
"C" LRDLLTEST_API int Sum(int a , int b);
//a + b
LRDLLTEST_API int Sum(int a , int b)
{
return a + b;
}
編譯,生成DLL:LRDllTest.dll

lr_load_dll方法 有了符合要求的DLL,調用lr_load_dll函數顯得非常的簡單。lr_load_dll的函數原型是:
lr_load_dll(library_name); 所以,只需要調用該函數,傳入需要引用的DLL路徑,如果DLL放在腳本目錄裡,可直接寫相對路徑。這裡,我推薦把該函數放在vuser_init這個 Action裡,一方面是由於vuser_init只會執行一次,如果我們放在中間的那個默認的Action中的話,DLL可能會被裝載多次,這是沒有必要的。另一方面,裝載DLL也需要一定的性能開銷,所以作為初始環境設置將它放在vuser_init中更加合理。
調用lr_load_dll裝載DLL後,就可以任意使用該DLL中的導出函數,而不需要再去做任何聲明了。嗯,用起來的確很簡單,VuGen中代碼如下:

vuser_init()
{
lr_load_dll("LRDllTest.dll");
return
0;
}
Action()
{
int a = Sum(1,2);
lr_output_message("a = %d",a);
return
0;
}
Load Generators調用遠程機器進行加壓時調用lr_load_dll的方法 有人會遇到這種情況,使用lr_load_dll加載DLL的腳本在本機是可以順利執行的,但是在Controller中通過負載生成器(Load Generators)調用遠程機器執行腳本時,腳本會無法順利執行,錯誤信息:
Error: CCI security error:You are running under secure mode and the function ci_load_dll is not allowed in this mode.
錯誤信息讓人百思不得其解,不過能夠猜到,肯定是遠程機器無法調用加載的DLL所致。
眾裡尋他千百度,暮然回首,解決辦法其實是如此的簡單:
菜單“File-Add file to script”,把要引用的DLL加進來,一切搞定!注意,Agent的Enable Firewall Agent選項不要勾上。 mdrv.dat方法 這個辦法比較毒,通過修改mdrv.dat文件,無需調用lr_load_dll即可使用該DLL任何導出函數。具體實施方法如下:

1. 將LRDllTest.dll拷貝到LoadRunner安裝路徑的Bin目錄下。

2. 修改mdrv.dat文件(安裝路徑的dat目錄下),因為選擇的是默認的Web協議,所以找到[lrun_api]節點,在後面加上一句:

WINNT_DLLS=LRDllTest.dll

OK,再試試不使用lr_load_dll函數,直接調用LRDllTest.dll中的Sum函數吧!
了解詳細的內容請參考LR的幫助:HP LoadRunner Virtual User Generator User's Guide > Appendixes >Calling External Functions > Loading a DLL—Globally

****************************************************************************************

lr_load_dll

Loads an external DLL.

Example:

In the following example, lr_load_dll is used so that a standard Windows message box can be displayed during script replay:

lr_load_dll("user32.dll");

MessageBoxA(NULL, "This is the message body", "message_caption", 0);

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved