LIB和DLL的区别与使用

    xiaoxiao2022-06-23  32

    显式链接 需要函数指针和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; }

    转载请注明原文地址: https://ju.6miu.com/read-1123526.html

    最新回复(0)