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