C#写的dll是没有dllMain入口函数的,是一种中间语言,需要.Net运行时进行做本地化工作,因此如果要调用C#写的dll,需要依赖.Net运行时,然而Qt中还无法直接调用.Net运行时,最好的方式是能够在Qt中直接调用C#dll的函数,但是Qt明显只能调用C++写的dll,所以就只能通过编写一个C++的dll导出接口供Qt调用,这个C++编写的dll对C#写的dll进行封装,这个C++的dll可以采用/CLR方式对C#编写的dll进行引用的,即将C++编写的dll中生成的.lib文件供Qt进行链接,由于该接口符合C++规范,所以Qt可以链接到对应的C++编写的dll。
---------------------
编译环境为:VS2010

C++ 中要加 extern "C"才行,不然生成后的DLL使用DLL查看器可以发现函数名前会是“int __cdecl api_add(int,int)”这种样子,无法使用。

加了  extern "C" 后再编译发现是标准的C DLL库了。

// CppDll.h

#pragma once
using namespace System::Reflection;

using namespace System;

extern "C" __declspec(dllexport) int api_add(int a, int b)
{
CSharpDll::CSharpClass obj;
return obj.add(a, b);
}
extern "C" __declspec(dllexport) void api_showBox(const char* content)
{
CSharpDll::CSharpClass obj;
String^ str = gcnew String(content);
obj.showBox(str);
}

--------------

其他相同

QT引用方式,三种

第一种、引用lib文件进行编译

1、pro文件加  

  LIBS += -LF:/QT5.11/TestCSharpDll -lCppDll

2、在CPP中声名 

extern "C" __declspec(dllexport) int api_add(int a, int b);
extern "C" __declspec(dllexport) void api_showBox(const char* content);

3、然后就可以直接使用了

qDebug()<<"C# DLL add:"<<api_add(8,5);

第二种、直接C++方式调用C++DLL

  //纯C++方式调用
  typedef int(CALLBACK *funci)(int,int);
  HINSTANCE hdll=LoadLibrary(L"MyDll2.dll"); //L指宽字符串,若不写L,则会出现错误,详情请自查
  funci t3=(funci)GetProcAddress(hdll,"_ZN6MyDll26lllsumEii");//这里原先写的函数名为“sum”但是QT编译后的DLL,通过DLL查看器会发现 函数名变了,所以调用时需要使用DLL查看器得到的这个名字才行,不然无法调用成功。
  qDebug()<<"C++ mode:"<<t3(9,9);

第三 种、QT的显示调用

    //MyDll test-----------------------
    typedef  int (* fun)(int,int );
    QLibrary mylib("MyDll.dll");
    //qDebug()<<"in dll function";
    if(mylib.load())
    {
        //qDebug()<<"加载DLL OK";
        fun fun1  = (fun)mylib.resolve("sum"); 
        //qDebug()<<"MyDLL open:"<<fun1;
        if(fun1)
        {
            qDebug()<<"resolve DLL OK";
            int ret = fun1(26,500);
            qDebug()<<"resolve MyDLL add:"<<ret;
        }else{
            qDebug()<<"resolve MyDLL 失败";
        }
    }else{
         qDebug()<<"加载DLL 失败";
    }
    //MyDll test-----------------------end

QT调用C++写的Dll相关推荐

  1. QT调用C#写的Dll

    QT调用C#写的Dll 参见: https://blog.csdn.net/weixin_42420155/article/details/81060945 C#写的dll是没有dllMain入口函数 ...

  2. QT 调用vs写的dll 使用OutputDebugString输出调试信息

    vs c++写的dll中使用的cout 将调试信息写到控制台中,但qt调用dll时,cout内容没有办法显示了. 解决办法:使用OutputDebugStringA char buf[128];spr ...

  3. 易语言如何调用c dll文件,易语言调用C++写的DLL

    直接调用会弹出堆栈错误的信息,原因是VS默认是__cdcel方式,而易语言是__stdcall,所以调用约定不一致导致堆栈错误. 解决方案很简单,易语言声明DLL函数时"在库中对应命令名&q ...

  4. c++调用c#写的DLL

    c++调用c#写的DLL: 此文章演示了建立c#的dll: c++建立工程,引入dll: 不能解决的问题: 指定dll的路径,在代码里面直接写 #using "xxx.dll" 必 ...

  5. C# 调用C++写的dll的实现方法

    文章目录 **C# 调用C++写的dll的实现方法** 一. dll的编写 2.C#调用 C# 调用C++写的dll的实现方法 C#调用C++的非托管类的dll其实很简单基本就是固定的调用格式. 一. ...

  6. VC调用C#写的DLL

    From: http://hi.baidu.com/ocnc/blog/item/2c7fc45c1d1f1051fbf2c0ea.html VC中调用C#写的DLL时,对C#这边的DLL有要求,即要 ...

  7. 【C++】QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例)

    QT调用VS封装的dll(以科大讯飞离线命令词识别SDK为例) 1.说明: 跨平台调用dll出现各种坑,谨以此文避坑. 参考博文:https://www.cnblogs.com/seer/p/4789 ...

  8. c#调用C++写的dll导出类,如何实现

    网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教 解决方案 » 类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管.然后C++文件 ...

  9. java com dll_通过COM组件方式实现java调用C#写的DLL文件

    通过Java调用C#的DLL文件实现.网上资料很多,自己整合总结了一下,做个备忘. 一.C#写com组件 开发环境 VS2013 1.新建工程:TestDemo(类库项目)     //根据自己需要取 ...

最新文章

  1. 抢占大数据产业发展先机
  2. 利用gulp,当引入文件改动时,版本号自动更新~
  3. php ajax 增删改查 分页,Jquery之Ajax_分页及增删改查
  4. java 事件分发机制_读Android源码之事件分发机制最全总结
  5. redis 字符串类型原子性实现方案与memcached-cas原子性性能比较
  6. Java之JMX 详解
  7. 删数问题(Noip1994)
  8. 爬虫404如何跳过_网络推广外包——网络推广外包专员如何从站内优化中提升网站收录...
  9. C语言 求平方 求开方
  10. Git命令提交代码步骤
  11. 多实例学习PCNN在关系抽取中的应用
  12. FLASH闪存文件系统研究
  13. asp.net将图片变成圆形
  14. dfuse for EOSIO 架构剖析:架构总览
  15. linux的sssd服务,linux – SSSD进程不会死
  16. Linux下通过已连上无线的真机使虚拟机可上网
  17. 【CXY】JAVA基础 之 Collection
  18. 羽毛球的主要击球技术
  19. 【上位机与下位机通信】使用WIFI模块ESP8266连接单片机与上位机通信
  20. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了

热门文章

  1. 验证回文串Python解法
  2. java时间错误_更改操作系统时间时睡眠()中的Java错误:任何解决方法?
  3. 如何判断三极管好坏?
  4. 看技术笔记,提高嵌入式基础
  5. 通电就可以工作,这些单片机真香!
  6. ctr 平滑_CTR平滑的原理,包懂!!!附代码
  7. php开启端口复用,请问下workman是否支持端口复用?
  8. 电脑亮度多少对眼睛好_鲁大师性能测试多少分算好电脑?
  9. mysql语句 查询前5个_MySQL 查询语句--------------进阶5:分组查询
  10. Vue.js(17)之 插槽