多线程调用DLL(面向对象)

前言:

       关于DLL的说明,这里所使用的DLL,并非是一些功能函数的集合,每次调用一个函数实现相应功能即可。而是封装了一个“小程序对象”,其前身是OCX,我们将OCX封装为一个DLL

       因此,此DLL中会存在某个对象A,生存周期伴随调用它的程序。

       可以认为,A便是我们封装的“小程序对象”。DLL所有的接口,实际上都是对应调用A的成员函数。

       这里便会存在一个问题,多线程情况下,DLL中的这个对象A,是共用的。而我们希望,每个线程所使用到的A是互不干扰的,它只属于各自的线程。      

例如OCX调用DLL,浏览器打开N个页面,调用OCX,是多线程的情况。但DLL不会生成多个副本去对应ocx,它只有一个DLL实例在浏览器进程下运行,此时就会出现我们上面所描述的问题。

因此,此处我们使用的对象是指针类型,每个线程,都会拥有它所对应的A

 

实现:

       采用面向对象方式,进行类的封装,程序中定义基类BASEDLL中的类CHILD,继承自BASECHILD型指针,便是对象A的类型。

       BASE类中提供所有的函数接口。在程序中,创建一个成员变量B,类型是BASE*

       我们在DLL中提供接口,用来NEW 一个CHILD,并将指针返还给程序。返还的指针,即赋给B

       此时,我们在程序中使用DLL,即可直接对B进行操作。因为前面所说,DLL所有的接口,实际上都是对应调用A的成员函数。因此,此处直接操作B,调用B的函数即可。

       因为我们每个程序实例,都会调用DLL接口,创建各自的A。所以在多线程情况下,也不会冲突。

 

代码示例:

基类CMyTestBaseClass

class CMyTestBaseClass: public CObject

{

public:

       CMyTestBaseClass();

       virtual ~CMyTestBaseClass();

 

public:

       virtual void TestShow() = 0;

};

 

 

 

子类CMyTestClass

class CMyTestClass: public CMyTestBaseClass

{

public:

       CMyTestClass();

       virtual ~CMyTestClass();

 

public:

       void TestShow();

};

 

DLL提供接口

LONG __declspec(dllexport)Kcxzt_TestCreate();

LONG  Kcxzt_TestCreate()

{

       CMyTestClass* p = new CMyTestClass;

       return (LONG)p;

}

 

程序中声明一个变量

CMyTestBaseClass* m_testPtr;

为变量赋值

m_testPtr = (CMyTestBaseClass*)(Kcxzt_TestCreate());

 

之后就可直接使用m_testPtr来操作DLL

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java多线程可以调用DLL(Dynamic-Link Library)来进行一些特定操作。 首先,在Java调用DLL需要使用到Java Native Interface(JNI)技术。JNI是Java提供的一种机制,用于在Java程序调用本地的C/C++代码。通过JNI,我们可以在Java程序加载和调用DLL的函数。 在多线程调用DLL的过程如下: 1. 首先,在Java编写一个JNI的接口类,用于定义与DLL函数的映射关系。这个接口类需要使用Java的native关键字来声明与DLL函数对应的本地方法。 2. 在DLL实现与接口类声明的本地方法对应的C/C++函数。这些函数可以通过DLL导出符号的方式供Java程序调用。 3. 在Java程序加载DLL调用的函数。 使用多线程调用DLL时,需要注意以下几点: 1. 线程安全性:在多线程环境下调用DLL时,需要确保DLL的函数是线程安全的,即能够正确处理多个线程间的共享数据。 2. 同步控制:如果DLL的函数需要访问共享资源,需要在Java程序使用同步控制机制,如synchronized关键字或Lock对象来确保线程之间的互斥访问。 3. 线程间通信:如果多个线程需要相互通信,可以通过共享内存或消息传递的方式实现。在DLL可以使用线程同步的机制来实现线程间的互斥、等待和通知操作。 总之,Java多线程可以通过JNI技术调用DLL来完成一些底层的特定操作。在进行多线程调用DLL时,需要保证线程安全性,确保合适的同步控制和线程间通信方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值