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类型,因为它的声明中没有用到上面的两个东东。
    但,要保证两边声明或定义一致。

    世界如此的美好,江山如此的多娇! ---阳光正能量--->>>>>>>>>>>>>>>
  • 相关阅读:
    云原生时代,微服务到底应该怎么玩儿?
    坐上机器猫的时光机,来一场科技穿越之旅吧
    喜讯|京东荣获2019 【中国技术品牌影响力企业】
    非洲正在打造一个与硅谷完全不同的人工智能产业
    DevOps专题|基础Agent部署系统
    《编写可读代码的艺术》总结
    《Effective Java第二版》总结
    MySQL之备份和还原
    MySQL之Xtrabackup的使用
    MySQL之mysqldump的使用
  • 原文地址:https://www.cnblogs.com/upendi/p/2604928.html
Copyright © 2011-2022 走看看