動態鏈接庫結構體類型參數的傳遞實例

本程序通過調用動態鏈接庫獲取局域網內可用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);

並不能獲取相應的參數值,雖然單步運行之後,動態鏈接庫中和調用主體中的參數地址中的值爲正確的值,但調用主體中的變量卻出現“字符串讀取錯誤”。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章