vs2008创建动态库和使用动态库的方法

一、创建动态库

打开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");
}

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值