zoukankan      html  css  js  c++  java
  • C/C++编写dll动态链接库使用操作与非基本类型参数声明错误

    在VC6.0 下编译通过。。。其它VC平台类似!

    一、建立 Win32 Dynamic-Link Library 项目

    【dll.cpp】

    #include <iostream>
    #include <string>

    #include "dll.h"

    using namespace std;

    void add(char* aa)
    {
     string bb = aa;
     cout << "you are right!" << "------" << bb <<endl;
    }

    【dll.h】

    #include <iostream>

    using namespace std;

    extern "C" _declspec(dllexport) void add(char* aa);

    build之后没有错误就成了,在项目debug目录下生成*.dll和*.lib两文件

    二、使用动态链接库要用到上面两生成的文件和dll.h头文件,共三文件。

    1、把.lib\.h文件拷贝工程目录下,把dll文件拷贝到debug目录下
    2、把lib加入到工程(工程-设置-连接)也可以用代码动态添加
    3、包含头文件后就可以使用导出的库函数了。

    在上面的cpp文件可以已经看出,在传递参数的时候,为什么把指针aa的值符给string bb使用,而不直接传进string类型的参数呢?在跨dll使用template/STL或者自定义类型时一般是会出现声明错误的,甚至更严重。因此,最好使用基本类型的参数进行传递。还有,dll和主程序之间是相对独立的,各自的内存堆栈分配也是独立的。

    在windows核心编程中明确的说了在dll中如果申请了内存空间,就一定要在dll中释放这块内存空间。在exe和dll都静态链接到C/C++运行时库的时候,exe和dll都有各自的堆(heap)空间,所以各自申请的内存需要各自释放。

    如果一定要使用非基本类型,也是有办法的。。。如果用容器的话,直接传就可以了(不用管容器里边是什么,只要保证两边编译的stl库一样);而且尽可能用引用,或者const修饰。
    对于string类型我到现在还不知道怎么传,如果有谁知道可以告诉我,感激不尽。。

    PS:对于windows下的DLL封装的函数调用时,或者想通过DLL将函数输出时,任何非基本类型的参数,都需要用__declspec(dllexport)和__declspec(dllimport) 。这具体是什么含义呢,就是如果参数里面出现了类(非基本的类型,非int ,char,bool之类的),都需要用上面两个声明来定义这个参数的类。例如DLL永远不能输出参数string类型,因为它的声明中没有用到上面的两个东东。
    但,要保证两边声明或定义一致。

    世界如此的美好,江山如此的多娇! ---阳光正能量--->>>>>>>>>>>>>>>
  • 相关阅读:
    "V租房"搭建微信租房平台,让租房人发起求租需求并接收合适房源回复,提高租房效率 | 36氪
    金融街
    Jsensation | 氪加
    Polyvore
    周翔宇_百度百科
    鸵鸟心态
    新闻:型牌男装:网上订服装,如何将返修率降到5个点以下 | IT桔子
    【案例】舒邑:一个女装品牌的奇葩打法-@i黑马
    专访OPPO李紫贵:ColorOS用户过千万 软硬融合生态版图初现
    关于我们-EIBOA易博男装-互联网品质男装品牌-在线销售男士西服,衬衫,外套,西裤,领带|全场免运费,30天退换货保障
  • 原文地址:https://www.cnblogs.com/upendi/p/2604928.html
Copyright © 2011-2022 走看看