一、创建动态库
打开vs2008,新建一个项目,选择win32->控制台应用程序->输入名称。
点击确定
点击下一步,选择DLL->勾选空项目,点击完成,至此工程创建完毕。
向工程中添加.h文件,声明接口函数,声明函数前加上关键字__declspec(dllexport),以便被外部引用,为了防止重名可加入namespace命名空间,这里不加了。添加.cpp文件,在.cpp文件中定义函数。
下面分别是.h和.cpp文件的代码,用于模拟socket通讯流程。
SocketClient.h代码如下
#pragma one
__declspec(dllexport) int SocketInit(void **handle);
__declspec(dllexport) int SocketSend(void *handle, char *SendBuf, int SendLen);
__declspec(dllexport) int SocketRec(void *handle, char *RecBuf, int *RecLen);
__declspec(dllexport) int SocketFree(void *handle);
SocketClient.cpp代码如下
#include "SocketClient.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int SocketInit(void **handle){
int ret = 0;
*handle = (void *)malloc(4097);//多分配一个空间,存放字符串结尾
if (*handle == NULL){
ret = -1;
}
return ret;
}
int SocketSend(void *handle, char *SendBuf, int SendLen){
int ret = 0;
if ((handle == NULL) || (SendLen > 4096)){
ret = -1;
}else{
memcpy((char *)handle, SendBuf, SendLen);
memset((char *)((char *)handle + SendLen ), 0 ,1);//字符串结尾加0
}
return ret;
}
int SocketRec(void *handle, char *RecBuf, int *RecLen){
int ret = 0;
if ((handle == NULL) || (RecBuf == NULL)){
ret = -1;
}else{
*RecLen = strlen((char *)handle);//若不是字符串,此处可能会导致异常
memcpy(RecBuf, (char *)handle, *RecLen );
RecBuf[*RecLen] = 0;
}
return ret;
}
int SocketFree(void *handle){
int ret = 0;
if (handle == NULL){
ret = -1;
}else{
free(handle);
}
return ret;
}
编译完之后,在Debug(Release)文件夹下会生成两个文件SocketClient.dll和SocketClient.lib,一会测试需要用到这两个文件。
二、使用动态库
打开vs2008,再新建一个项目,选择win32->控制台应用程序->输入名称。点确定后,点击下一步。选择控制台应用程序,勾选空项目。
在测试工程SocketClientTest目录下新建一个include文件夹,把动态库工程SocketClient的SocketClient.h、SocketClient.lib和拷贝到include文件夹。
把动态库工程工程SocketClient的SocketClient.dll拷贝SocketClientTest工程目录中的Debug文件夹下(注:如果是用Release模式编译,则放到Release文件夹)。后期如果只更改了.dll文件中的函数实现,只需更新这个文件即可。
配置测试工程SocketClientTest的工程属性,C/C++ -> 常规 –> 附加包含目录(存放SocketClient.h和SocketClient.lib的目录)。
链接器 –> 常规 –>附加包含目录(存放SocketClient.h和SocketClient.lib的目录)。
链接器 –> 输入 –>附加依赖项(SocketClient.lib)。
配置完测试工程后,在测试工程总添加.cpp文件,用于测试动态库,如下图,在.cpp文件中引用动态库的头文件。
测试工程的.cpp代码如下
SocketClientTest.cpp
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "SocketClient.h"//添加dll的头文件
void main()
{
void *handle = NULL;
char RecBuf[4096];
int RecLen;
if (SocketInit(&handle)){
printf("SocketInit error\n");
}
if (SocketSend(handle, "aabbccddeeff", strlen("aabbccddeeff"))){
printf("SocketSend error\n");
}
if (SocketRec(handle, RecBuf, &RecLen)){
printf("SocketRec error\n");
}else{
printf("RecBuf[%d] = \"%s\"\n", RecLen, RecBuf);
}
if (SocketFree(handle)){
printf("SocketFree error\n");
}
system("pause");
}