Qt加载OCX控件,怎么把回调函数传给控件

Qt加载OCX控件,怎么把回调函数传给控件,第1张

控件里的回调函数设置接口是:

void CtestOCXCtrl::SetCallBack(VARIANT &cbFun)

{

AFX_MANAGE_STATE(AfxGetStaticModuleState())

if (cbFun.vt == VT_DISPATCH)

m_spCallbackIntercomFunc = cbFun.pdispVal

}

我之前用过jni和jna框架,这里有段我写的jni例子,你参考下:

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

1.java文件:HelloWorld.java

public native void sayHello()

public static void main(String[] args){

System.loadLibrary("HelloWorld")

new HelloWorld().sayHello()

}

}

2.编译:javac HelloWorld.java

3.生成头文件:javah HelloWorld,注意应从java_home中拷贝jni.h和jni_md.h到当前目录中

/* DO NOT EDIT THIS FILE - it is machine generated */

#include "jni.h"

/* Header for class HelloWorld */

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: HelloWorld

* Method:sayHello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_HelloWorld_sayHello

(JNIEnv *, jobject)

#ifdef __cplusplus

}

#endif

#endif

4.编写C代码:HelloWorld.c

#include "HelloWorld.h"

#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_sayHello(JNIEnv * j, jobject jo)

{

printf("HelloWorld!")

}

5.编译

gcc -shared -o libHelloWorld.so HelloWorld.c

6.运行

java HelloWorld

注意,要将libHelloWorld.so放在LD_LIBRARY_PATH中。

public class UnsatisfiedLinkErrorextends LinkageError当 Java 虚拟机无法找到声明为 native 的方法的适当本地语言定义时,抛出该错误。

nm libHelloWorld.so | grep Java查看so中的相关函数。

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

我之前公司的有些情况是这样:

1、页面上调用控件向COM串口发送数据,这个是js实现的,在html的body中有个object的属性可以指定所用的控件,然后js直接方法名调用就可以。

2、在服务器端,使用的是jna调用本地的so库文件,在windows下就是dll文件。如上面的小例子,如果用jni需要额外引入个jna.jar包

3.以下是一个jna的小例子

import com.sun.jna.Libraryimport com.sun.jna.Native

public class XXXJNA {

public interface XXXLib extends Library{

//调用linux下面的so文件

XXXLib INSTANCE = (XXXLib) Native.loadLibrary("example",XXXLib.class)

int Open(int number)

}

public int Open(int number){

return XXXLib.INSTANCE.Open(number)

}

public static void main(String[] args) {

try{

XXXJNA xJNA = new XXXJNA()

xJNA.Open(0)

}catch(Exception e){

e.printStackTrace()

}

}

}

jna调用方便,只要把相应的库文件放到指定目录即可(win中放在path下面,linux下放在

LD_LIBRARY_PATH下面),然后用上面的模板模仿即可。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11608630.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存