显式链接
需要函数指针和WIN32 API函数LoadLibrary、GetProcAddress装载,使用这种载入方法,不需要.lib文件和.h头文件,只需要.dll文件即可(将.dll文件置入工程目录中)。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <windows.h>
#include <stdlib.h>
using namespace std;
typedef int(*CltSocketInit)(void **);
typedef int(*CltSocketSend)(void *handle /*in*/, unsigned char *buf /*in*/, int buflen /*in*/);
typedef int(*CltSocketRev)(void *handle /*in*/, unsigned char *buf /*in*/, int *buflen /*in out*/);
typedef int(*CltSocketDestory)(void *handle/*in*/);
int main()
{
int rv = 0;
void *handle = NULL;
HINSTANCE hInstLibrary = LoadLibrary(L"socketclient.dll");
if (hInstLibrary == NULL)
{
cout << "LoadLibrary failed" << endl;
FreeLibrary(hInstLibrary);
return -1;
}
CltSocketInit init = (CltSocketInit)GetProcAddress(hInstLibrary, "cltSocketInit");
CltSocketSend send = (CltSocketSend)GetProcAddress(hInstLibrary, "cltSocketSend");
CltSocketRev rev = (CltSocketRev)GetProcAddress(hInstLibrary, "cltSocketRev");
CltSocketDestory destroy = (CltSocketDestory)GetProcAddress(hInstLibrary, "cltSocketDestory");
if (init == NULL || send == NULL || rev == NULL || destroy == NULL)
{
cout << "func GetProcAddress () is NULL" << endl;
FreeLibrary(hInstLibrary);
return -1;
}
rv = init(&handle);
if (rv != 0)
{
cout << "func init(): rv = " << rv << endl;
goto SocketEnd;
}
unsigned char buf[2048];
strcpy((char *)buf, "12345678901234567890");
int buflen = 10;
rv = send(handle, buf, buflen);
if (rv != 0)
{
cout << "func send(): rv = " << rv << endl;
goto SocketEnd;
}
unsigned char recBuff[1024] = { '0',};
int revLen;
rv = rev(handle, recBuff, &revLen);
if (rv != 0)
{
cout << "func rev(): rv = " << rv << endl;
goto SocketEnd;
}
cout << recBuff << endl;
SocketEnd:
rv = destroy(handle);
if (rv != 0)
{
cout << "func destroy(): rv = " << rv << endl;
FreeLibrary(hInstLibrary);
return -1;
}
return 0;
}