本程序通過調用動態鏈接庫獲取局域網內可用IP。
爲了獲取動態鏈接庫中的結構體類型變量,可以在調用動態鏈接庫時傳入相同結構的結構體參數。
例:
//動態鏈接庫,通過調用IPscan()可以獲得參數值:ip_scan_reply
DLL
.h
typedef struct
{
char echo_ip[100][16];
BOOL error_message;
}IP_SCAN_REPLY;
//聲明函數爲導出函數返回參數、形參類型要和函數本身保持一致
extern "C" _declspec(dllexport) void IPscan(IP_SCAN_REPLY * ip_scan_reply);
.cpp
void IPscan(IP_SCAN_REPLY * ip_scan_reply)
{
/**************
函數體
**************/
(* ip_scan_reply) = result;
return;
}
下面是調用上述動態鏈接庫並獲取動態鏈接庫執行結束後的參數
ip_scan_reply
的方法。
//MFC調用動態鏈接庫
//定義相同結構的結構體
typedef struct
{
char echo_ip[100][16];
BOOL error_message;
}IP_SCAN_REPLY;
//按鈕事件
void CLocal_Area_Network_IP_ScanDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
//定義dll的句柄
HINSTANCE hDll = NULL;
//定義結構體變量,用於存儲從動態鏈接庫返回的參數
IP_SCAN_REPLY echo_reply;
//定義函數的結構要和動態鏈接庫中導出函數保持一致
typedef void (* Function)(IP_SCAN_REPLY *);
Function LanIPscan;
hDll = LoadLibrary(_T("Local_Area_Network_IP_ScanDLL.dll"));
if(!hDll)
{
AfxMessageBox(_T("動態鏈接庫加載失敗!"));
return;
}
LanIPscan = (Function)GetProcAddress(hDll, "IPscan");
if(LanIPscan == NULL)
{
AfxMessageBox(_T("獲取函數失敗!"));
return;
}
memset(&echo_reply, 0, sizeof(echo_reply));
//將參數傳入動態鏈接庫
LanIPscan(&echo_reply);
FreeLibrary(hDll);
return;
}
通過動態鏈接庫獲取的參數是形如"192.168.1.3"、"192.168.1.211"等點分十進制IP字符串,在上面的程序中,是將字符串通過轉換之後拆分成單個字符存儲在數組中,如下:
echo_ip[0][0] = '1';
echo_ip[0][1] = '9';
echo_ip[0][2] = '2';
echo_ip[0][3] = '.';
.
.
.
echo_ip[0][15] = '\0';
因此程序中定義的結構體理論上也可定義爲如下形式:
DLL
typedef struct
{
string echo_ip[100];
BOOL error_message;
}IP_SCAN_REPLY;
MFC
typedef struct
{
CString echo_ip[100];
BOOL error_message;
}IP_SCAN_REPLY;
/*************************
存儲方式如下:
echo_ip[0] = "192.168.1.2";
echo_ip[1] = "192.168.1.211";
.
.
.
**************************/
但在實際應用時,在調用動態鏈接庫執行完下面的語句:
LanIPscan(&echo_reply);
並不能獲取相應的參數值,雖然單步運行之後,動態鏈接庫中和調用主體中的參數地址中的值爲正確的值,但調用主體中的變量卻出現“字符串讀取錯誤”。