gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:39:14 24 4
gpt4 key购买 nike

我正在尝试编写一个应用程序以通过以太网使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com