qt5编写dll给c#调用

最近手头有个项目, qt编写dll, 实现串口通信, 并用c# wpf调用

参考文献: https://www.cnblogs.com/feiyangqingyun/p/3720777.html

这里使用的是qtwinmigrate的类库

移植上面作者实现dll时, 报了很多错,猜测可能是作者是qt4写的

qt dll

1. 目录树:

qt5编写dll给c#调用_第1张图片

src是qtwinmigrate中的文件

main.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;
}

2. c#控制台程序

目录树

qt5编写dll给c#调用_第2张图片

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace csharp_testdll
{
    class Program
    {
        //声明DLL中的函数
        [DllImport("qtdll.dll")]
        public static extern int add(int i);
        //声明DLL中的回调函数,即事件
        [DllImport("qtdll.dll")]
        public static extern void SetFunCallBack([MarshalAs(UnmanagedType.FunctionPtr)] CallbackFun pCallbackFun);
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        public delegate void CallbackFun(int i);

        public static void HandleEvent(int i)
        {
            Console.WriteLine(i);
        }

        static void Main(string[] args)
        {
            CallbackFun HandleEventX = HandleEvent;
            SetFunCallBack(HandleEventX);
            Console.WriteLine(add(1));
            Console.WriteLine(add(110));
            Console.ReadLine();
        }
    }
}

命令行启动csharp-testdll.exe

好的东西就要分享

git: https://github.com/fox1997/qtdll

csdn:https://download.csdn.net/download/empty_android/11021563

你可能感兴趣的:(Qt)