我正在尝试编写一个应用程序,通过以太网网络使用控制器区域网络设备,因此工程师可以连接到物理连接到CAN总线的技术人员笔记本电脑。我想使用通用RP1210设备标准,因为大多数数据链路适配器都支持此标准。基本应用程序有客户端和服务器端。 RP1210标准要求DLA制造商提供与硬件接口的DLL,并提供可通过使用LoadLibrary和GetProcAddress访问的通用API函数。使单线程应用程序运行良好但在操作中应用程序将需要多线程,因为需要在提供发送信号以刺激响应时进行阻塞读取调用。
轮子脱落的地方是我无法从第二个线程获得任何可用的数据,第一个线程工作正常,但第二个线程返回坏值并崩溃。
我尝试在主线程中使用LoadLibrary和GetProcAddress的单个对象,并指向另一个线程,这适用于第一个线程,但不适用于第二个线程。我尝试调用LoadLibrary一次并将句柄传递给踏板并从每个线程调用GetProcAddress。我也试过从每个线程调用LoadLibrary和GetProcAddress,其中没有一个工作,结果与上面相同。
我有一些问题: 在一个线程中创建的dll函数指针是否可以在另一个线程中使用?
GetProcAddress可以返回另一个线程无法使用的地址,两个线程中的指针都有非NULL值。
应用程序是使用QT5.9-3和Windows 8.1上的MinGw编译器编写的C ++。 线程是使用QThread创建的,它们是从QTcpServer类实例化的。
函数指针实例化如下:
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 );
}
答案 0 :(得分:2)
不,GetProcAddress返回的指针对所有线程都有效。
但是,对象(句柄或其他)很可能只能从一个线程中使用。