最近这阵子,接了个私活,封装一个开发包俗称的SDK给客户调用,查阅了很多人家的SDK,绝大部分用VC编写,而且VC6.0居多,估计也是为了兼容大量的XP用户及IE浏览器,XP自带了VC6.0运行库,所以无需兼带其他DLL即可运行。也发现有些用汇编和C封装的,那估计是高手才能编写啊!那怎么办呢?眼看一星期的交货期要到了,由于本人从来没有写过SDK开发包,心里那个着急啊,赶紧想出了三种处理方案。

方案一:

用自己最熟悉的QT来写,毕竟QT也是C++的一种嘛,应该可以和VC通用的。初步实验,你妹啊,调用不起来,直接废弃。

方案二:

找VC高手,自己掏钱出来找人写,客户是上帝,那可不能耽误呢!各大群里发消息,无奈高手要价太高(一个简单的socket通信封装,协议都有,熟手估计半天,要价8K有点高),绝大部分答话者使用.NET和JAVA语言,这个编写DLL肯定不大适合,你想想提供个DLL还要客户安装个框架,情何以堪!话说众里寻他千百度啊,我一个亲戚就是专门搞VC开发12年啦,这点程序半天就可以搞定的,找到之后,时间有限太忙了,没时间写,郁闷!再次放弃!~

方案三:

时间一分一秒过去,真心着急啊,难不成自己用VC编写?有想法就赶紧行动,找到了古董级别的VS6.0的安装光盘,双击看到阔别七年的安装界面,突然之间有种热泪盈眶的感觉。老朋友啊,当年的编程入门,又记起了当年的大学,当年的图书馆,当年的初恋!

搞就搞,新建MFC DLL,我的妈呀,VC的命名规则实在让人抓狂!半自动语法提示更是让我有种自杀的冲动!安装了visualAssistX,还是不爽!话说编程也要带着快乐的心情嘛,所以果断放弃!

怎么办呢?既然QT也是C++,而且有个大名鼎鼎的WPS都是QT和MFC混合编程的,所以肯定有方法的,百度谷歌,找到一个qtwinmigrate的东西,在这里万分感谢qtwinmigrate的作者!

好吧,参考里面的例子,正式开始编写了,咱就先来一个最初级的吧。

第一步:

打开qt creator,新建C++ 库项目

依次下一步,记得在选择需要的模块的时候选择QtGui模块,如果没有选中的话,后面编译通不过,qmfcapp这个类里面用了QtGui模块中的方法。

第二步:

将多余的文件删除,_global.h还有其他两个文件删除,因为这是QT新建DLL自带的,我们要写的是可以供其他语言调用的DLL,我这里的例子是只用了一个函数和事件,没有用到界面的东西,所以从qtwinmigrate下面的src文件夹拷贝qmfcapp.h和qmfcapp.cpp这两个文件过来即可,如下。

第三步:

更改pro文件,改为

TARGET = qtdll

TEMPLATE = lib

CONFIG += dll

SOURCES += \

qmfcapp.cpp \

main.cpp

HEADERS +=\

qmfcapp.h

main.cpp代码如下

         ownApplication = QMfcApp::pluginInstance( hInstance );
              delete qApp;
  
      }
  
        
   {
     OnEvent=fun;
     par=p;
 }
  
   {
      ){
                       );
         }
     }
  
     ;
 }

选择release编译,在目录下生成了一个DLL文件,这个文件就可以供VC/C#/VB/JAVA等调用了。

第四步:编写VC和C语言程序测试

main.c代码如下:

  {
 printf( }
  
   {
    {
    
     SetFunCallBack(HandleEvent);
 }
  
    ));
  
  ));
  
 FreeLibrary(hDll);
 }
 ;
 }

运行结果如图:

当传入的参数为110时,会触发事件,返回值120。

第五步:编写C#程序测试

                                               [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
           
                  {
             Console.WriteLine(i);
         }
  
                  {
             CallbackFun HandleEventX = HandleEvent;
             SetFunCallBack(HandleEventX);            
             Console.WriteLine(add());
             Console.WriteLine(add());
             Console.ReadLine();
         }
     }
 }

运行结果:

CSDN下载地址:http://download.csdn.net/detail/feiyangqingyun/7327095

QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)的更多相关文章

  1. Qt编写的开源帖子集合(懒人专用)

    回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...

  2. Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  3. Qt DLL总结【二】-创建及调用QT的 DLL

    开发环境:VS2008+Qt4.7.4 最近看了不少Qt的DLL例子,总结一下如何创建和调用QT 动态链接库. 先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数 ...

  4. 可供VC调用的QT编写的界面DLL方法

    一般直接编写的QT动态库是无法被Windows下的VC6.0等调用的. 如下步骤 第一步:必须要在QT界面库源码下包含qtwinmigrate的源码包和库,网上可下载到. 第二步:在QT的proc文件 ...

  5. 将QT开发的界面程序封装成DLL,在VC中成功调用

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  6. 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  7. 关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

    前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调 ...

  8. qt 创建及调用QT的 DLL

    先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数 ...

  9. Qt编写自定义控件插件开放动态库dll使用(永久免费)

    这套控件陆陆续续完善了四年多,目前共133个控件,除了十几个控件参考网友开源的代码写的,其余全部原创,在发布之初就有打算将动态库开放出来永久免费使用,在控件比较完善的今天抽了半天时间编译了多个qt版本 ...

随机推荐

  1. ajaxSubmit与ajaxFileUpload的空值

    ajaxSubmit发现正文无内容, ajaxFileUpload发现无上传内容, 嗯,你只是忘记了 html 中控件的 name 没有指定,这哥们不认 id 的.

  2. Linux系列笔记 - 用户以及用户组命令

    一.前言 这一系列的随笔笔记,并不是详细的说明的命令的原理,只是简单的记录, 以备后期的查看以及复习 二.直接输入命令问题 有时候,我们在用 useradd groupadd等命令时,直接在终端输入的 ...

  3. atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源

    atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源 1. GMT(Greenwich Mean Time)是格林尼治平时 ...

  4. SQL语句的基础

    注释语法:#注释语 一.T-SQL语句注意:1.语句写完后用"分号:"代表这一句结束2.列结束用逗号,最后一列写完不用写逗号3.符号一定是英文的 关键字:主键:primary ke ...

  5. Eclipse连接到My sql数据库之前操作

    Eclipse连接到My sql数据库之前操作 1:首先是安装My sql数据库(为了减少你的麻烦,按照下面的连接,下载即可)百度云链接:http://pan.baidu.com/s/1mitWmbm ...

  6. 详解Bootstrap列表组组件

    列表组可以用来制作列表清单.垂直导航等效果,也可以配合其他的组件制作出更漂亮的组件,列表组在bootstrap框架中也是一个独立的组件,所以也对应有自己独立源码: LESS:list-group.le ...

  7. UHF桌面式发卡器

    UHF桌面式发卡器: http://www.rr-rfid.com/index.php/pro_view/95  本文用菊子曰发布

  8. 使用jquery修改css中带有!important的样式属性

    当CSS中含有!important的样式属性时,普通的修改方式是会出现失败的.如下: <div class="test">使用jquery修改css中带有!import ...

  9. 移动平台自动化测试从零开始-MonkeyRunner工具使用 (第二节)

    选自:http://yuedu.baidu.com/search?word=%D3%DA%D3%BF&pbook=0 第2节  MonkeyRunner 安装部署 如果您已经正确的安装部署了A ...

  10. ubuntu bless 16字节每行

    打开Preferences配置 输入路径:/usr/share/bless/bless-16-bytes-per-row.layout 或者使用以下配置 cat /home/scue/.config/ ...