.net core 调用c dll_Qt编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
一、前言
最近這陣子,接了個私活,封裝一個開發包俗稱的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 = qtdllTEMPLATE = libCONFIG += dll SOURCES += qmfcapp.cpp main.cpp HEADERS +=qmfcapp.hmain.cpp代碼如下
#include "qmfcapp.h"#include "windows.h" //windows下DLL函數入口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;} //定義函數回調指針typedef void (CALLBACK *FunCallBack)(int par);//定義回調函數FunCallBack OnEvent=NULL;//定義回調參數int par; //定義C語言類型導出事件函數extern "C" __declspec(dllexport) void SetFunCallBack(FunCallBack fun,int p){ OnEvent=fun; par=p;} //定義C語言類型導出函數extern "C" __declspec(dllexport) int add(int i){ //下面這段代碼用來觸發事件,如果僅僅是使用add函數的話可以刪除. if (i==110){ if (OnEvent){ //當傳入參數為110而且已經定義過回調函數的話,則觸發事件. OnEvent(120); } } return i*2;}選擇release編譯,在目錄下生成了一個DLL文件,這個文件就可以供VC/C#/VB/JAVA等調用了。
第四步:編寫VC和C語言程序測試
main.c代碼如下:
#include #include //定義函數指針typedef int (*Add)(int);//定義回調函數指針typedef void (CALLBACK *FunCallBack)(int); //定義回調函數處理方法void CALLBACK HandleEvent(int par){printf("%d 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的.net core 调用c dll_Qt编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA进阶教学之(产生随机数)
- 下一篇: 计算机系统账户被锁定,帐号已经被系统锁定