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

    世界如此的美好,江山如此的多娇! ---阳光正能量--->>>>>>>>>>>>>>>
  • 相关阅读:
    Java如何编写自动售票机程序
    install windows service
    redis SERVER INSTALL WINDOWS SERVICE
    上传文件
    This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
    解决Uploadify上传控件加载导致的GET 404 Not Found问题
    OracleServiceORCL服务不见了怎么办
    Access to the temp directory is denied. Identity 'NT AUTHORITYNETWORK SERVICE' under which XmlSerializer is running does not have sufficient permiss
    MSSQL Server 2008 数据库安装失败
    数据库数据导出成XML文件
  • 原文地址:https://www.cnblogs.com/upendi/p/2604928.html
Copyright © 2011-2022 走看看