.net core 调用c dll_Qt编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
一、前言
最近這陣子,接了個私活,封裝一個開發(fā)包俗稱的SDK給客戶調(diào)用,查閱了很多人家的SDK,絕大部分用VC編寫,而且VC6.0居多,估計也是為了兼容大量的XP用戶及IE瀏覽器,XP自帶了VC6.0運行庫,所以無需兼帶其他DLL即可運行。也發(fā)現(xiàn)有些用匯編和C封裝的,那估計是高手才能編寫啊!那怎么辦呢?眼看一星期的交貨期要到了,由于本人從來沒有寫過SDK開發(fā)包,心里那個著急啊,趕緊想出了三種處理方案。
二、方案
方案一:
用自己最熟悉的Qt來寫,畢竟Qt也是C++的一種嘛,應(yīng)該可以和VC通用的。初步實驗,你妹啊,調(diào)用不起來,直接廢棄。
方案二:
找VC高手,自己掏錢出來找人寫,客戶是上帝,那可不能耽誤呢!各大群里發(fā)消息,無奈高手要價太高(一個簡單的socket通信封裝,協(xié)議都有,熟手估計半天,要價8K有點高),絕大部分答話者使用.NET和JAVA語言,這個編寫DLL肯定不大適合,你想想提供個DLL還要客戶安裝個框架,情何以堪!話說眾里尋他千百度啊,我一個親戚就是專門搞VC開發(fā)12年啦,這點程序半天就可以搞定的,找到之后,時間有限太忙了,沒時間寫,郁悶!再次放棄!~
方案三:
時間一分一秒過去,真心著急啊,難不成自己用VC編寫?有想法就趕緊行動,找到了古董級別的VS6.0的安裝光盤,雙擊看到闊別七年的安裝界面,突然之間有種熱淚盈眶的感覺。老朋友啊,當(dāng)年的編程入門,又記起了當(dāng)年的大學(xué),當(dāng)年的圖書館,當(dāng)年的初戀!
搞就搞,新建MFC DLL,我的媽呀,VC的命名規(guī)則實在讓人抓狂!半自動語法提示更是讓我有種自殺的沖動!安裝了visualAssistX,還是不爽!話說編程也要帶著快樂的心情嘛,所以果斷放棄!
怎么辦呢?既然Qt也是C++,而且有個大名鼎鼎的WPS都是Qt和MFC混合編程的,所以肯定有方法的,百度谷歌,找到一個qtwinmigrate的東西,在這里萬分感謝qtwinmigrate的作者!
好吧,參考里面的例子,正式開始編寫了,咱就先來一個最初級的吧。
三、步驟
第一步:
打開qt creator,新建C++ 庫項目
依次下一步,記得在選擇需要的模塊的時候選擇QtGui模塊,如果沒有選中的話,后面編譯通不過,qmfcapp這個類里面用了QtGui模塊中的方法。
第二步:
將多余的文件刪除,_global.h還有其他兩個文件刪除,因為這是Qt新建DLL自帶的,我們要寫的是可以供其他語言調(diào)用的DLL,我這里的例子是只用了一個函數(shù)和事件,沒有用到界面的東西,所以從qtwinmigrate下面的src文件夾拷貝qmfcapp.h和qmfcapp.cpp這兩個文件過來即可,如下。
第三步:
更改pro文件,改為
TARGET = qtdllTEMPLATE = libCONFIG += dll SOURCES += qmfcapp.cpp main.cpp HEADERS +=qmfcapp.hmain.cpp代碼如下
#include "qmfcapp.h"#include "windows.h" //windows下DLL函數(shù)入口BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved ){ static bool ownApplication = FALSE; if ( dwReason == DLL_PROCESS_ATTACH ) ownApplication = QMfcApp::pluginInstance( hInstance ); if ( dwReason == DLL_PROCESS_DETACH && ownApplication ) delete qApp; return TRUE;} //定義函數(shù)回調(diào)指針typedef void (CALLBACK *FunCallBack)(int par);//定義回調(diào)函數(shù)FunCallBack OnEvent=NULL;//定義回調(diào)參數(shù)int par; //定義C語言類型導(dǎo)出事件函數(shù)extern "C" __declspec(dllexport) void SetFunCallBack(FunCallBack fun,int p){ OnEvent=fun; par=p;} //定義C語言類型導(dǎo)出函數(shù)extern "C" __declspec(dllexport) int add(int i){ //下面這段代碼用來觸發(fā)事件,如果僅僅是使用add函數(shù)的話可以刪除. if (i==110){ if (OnEvent){ //當(dāng)傳入?yún)?shù)為110而且已經(jīng)定義過回調(diào)函數(shù)的話,則觸發(fā)事件. OnEvent(120); } } return i*2;}選擇release編譯,在目錄下生成了一個DLL文件,這個文件就可以供VC/C#/VB/JAVA等調(diào)用了。
第四步:編寫VC和C語言程序測試
main.c代碼如下:
#include #include //定義函數(shù)指針typedef int (*Add)(int);//定義回調(diào)函數(shù)指針typedef void (CALLBACK *FunCallBack)(int); //定義回調(diào)函數(shù)處理方法void CALLBACK HandleEvent(int par){printf("%d 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的.net core 调用c dll_Qt编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA进阶教学之(产生随机数)
- 下一篇: c#养老院老人信息管理系统源码 论文_包