首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多线程中使用DLL函数指针

在多线程中使用DLL函数指针
EN

Stack Overflow用户
提问于 2017-12-31 05:14:50
回答 1查看 390关注 0票数 0

我正在尝试编写一个应用程序,以便通过以太网使用控制器区域网络设备,这样工程师就可以连接到物理连接到can总线的技术人员笔记本电脑。我想使用通用RP1210设备标准,因为大多数数据链路适配器都支持此标准。基本应用程序有客户端和服务器端。RP1210标准要求DLA制造商提供与硬件接口的动态链接库,并提供可通过使用LoadLibrary和GetProcAddress访问的公共RP1210函数。创建单线程应用程序工作得很好,但在操作中,应用程序需要是多线程的,因为在提供发送信号以刺激响应的同时,需要有一个阻塞的读取调用。

出现问题的地方是我无法从第二个线程获取任何可用的数据,第一个线程工作正常,但是第二个线程返回错误的值并崩溃。

我尝试在主线程中使用带有LoadLibrary和GetProcAddress的单个对象,并给出指向另一个线程的指针,这在第一个线程上有效,但在第二个线程上不起作用。我尝试调用LoadLibrary一次,并将句柄传递给踏板,然后从每个线程调用GetProcAddress。我还尝试从每个线程调用LoadLibrary和GetProcAddress,都不起作用,结果与上面相同。

我有一些问题:在一个线程中创建的dll函数指针应该在另一个线程中使用吗?

如果GetProcAddress返回的地址不能被另一个线程使用,则两个线程中的指针都具有非空值。

应用程序是使用QT5.9-3和Windows8.1上的MinGw编译器编写的C++。线程是使用从QTcpServer类实例化的QThread创建的。

函数指针的实例化方式如下:

代码语言:javascript
复制
typedef short (WINAPI *fxRP1210_ClientConnect)(HWND,short,char*,long,long,short);

fxRP1210_ClientConnect pRP1210_ClientConnect = NULL;

pRP1210_ClientConnect = (fxRP1210_ClientConnect)(GetProcAddress(m_dll_handle,"RP1210_ClientConnect"));

short DLLEXPORT WINAPI BUS_ClientConnect(HWND, short, char*, long send_buf, long recv_buf, short sftw);

在cpp中

代码语言:javascript
复制
short Rp1210DllFunctions::BUS_ClientConnect(HWND win_handle, short client_id, char *protocol, long send_buf, long recv_buf, short sftw)
{
    return pRP1210_ClientConnect( win_handle, client_id, protocol, send_buf, recv_buf,sftw );
}
EN

回答 1

Stack Overflow用户

发布于 2017-12-31 05:19:49

否,GetProcAddress返回的指针对所有线程都有效。

然而,对象(句柄或其他对象)很可能只能从一个线程使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48037950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档