c++ - 在多线程中使用 DLL 函数指针

标签 c++ multithreading qt

我正在尝试编写一个应用程序以通过以太网使用 Controller 区域网络设备,这样工程师就可以连接到与 CAN 总线物理连接的技术人员笔记本电脑。我想使用通用的 RP1210 设备标准,因为大多数数据链路适配器都支持该标准。基本应用程序有客户端和服务器端。 RP1210 标准要求 DLA 制造商提供与硬件接口(interface)的 DLL,并提供可使用 LoadLibrary 和 GetProcAddress 访问的通用 API 函数。使单线程应用程序完美运行,但在操作中,应用程序将需要多线程,因为需要在提供发送信号以刺激响应的同时进行阻塞读取调用。

轮子脱落的地方是我无法从第二个线程取回任何可用数据,第一个线程工作正常但第二个线程返回错误值并崩溃。
我已经尝试在主线程中使用带有 LoadLibrary 和 GetProcAddress 的单个对象并提供指向另一个线程的指针,这适用于第一个线程,但不适用于第二个线程。我尝试调用一次 LoadLibrary 并将句柄传递给踏板并从每个线程调用 GetProcAddress。我还尝试从每个线程调用 LoadLibrary 和 GetProcAddress,但都不起作用,结果与上述相同。

我有几个问题: 在一个线程中创建的 dll 函数指针是否可以在另一个线程中使用?

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

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

函数指针是这样实例化的:

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中

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 );
}

最佳答案

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

但是,很可能对象(句柄或其他)只能在一个线程中使用。

关于c++ - 在多线程中使用 DLL 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48037950/

相关文章:

c++ - 如何使用包含的转换的等级比较两个标准转换序列

C++ 从 URL 解析主机 IP 地址

完成主要代码后出现 java.nio.channels.ClosedSelectorException

c++ - 如何从路径加载 QImage?

c++ - a 到 z 的键盘字母在 Qt 的 keyPressEvent 中不起作用

c++ - 如何从 vector<shared_ptr> 中删除一个元素

c++ - 使用双指针反向链接列表

python - 在多线程环境中将 JSON 转储到文件

java - Kafka : Single consumer group, 无分区和多个主题

c++ - 如果从构造函数调用 QWidget winId 崩溃