我正在尝试使用NI-VISA 5.1.1通过USB与示波器进行通信。我的32位应用程序是使用C ++和MinGW编译器(标准Qt 4.7 SDK)在Qt框架中编写的。
当我静态链接到visa32.lib时,我的应用程序与设备通信没有问题。我的动态链接代码在Windows 7 64位平台上运行良好,但在Windows XP SP3(32位)上运行的两台不同计算机上崩溃。我已经跟踪了导致崩溃的代码行(这是对viWrite的第一次调用)。
这个问题似乎与DLL本身中全局变量的设置有关。这可能解释了为什么它在Windows 7中有效,因为在这种情况下,32位DLL文件只是一个调用64位VISA DLL文件的存根。
这是我动态链接到导出函数的方式:
typedef long (*tviRead)(ViSession, ViPBuf, ViUInt32, ViPUInt32);
typedef long (*tviWrite)(ViSession, ViBuf, ViUInt32, ViPUInt32);
QLibrary visa32("visa32"); // Qt wrapper for LoadLibrary
if (!visa32.load()) throw "Unable to load visa32.dll";
pviWrite = (tviWrite) visa32.resolve("viWrite");
pviRead = (tviRead) visa32.resolve("viRead");
如果我调用以下内容(其中vi
前缀函数是静态链接的,而pvi是运行时链接的),
status = viOpenDefaultRM(&rm);
status = viFindRsrc(rm, query, &list, &itemCnt, desc);
status = viOpen(rm, desc, VI_NULL, VI_NULL, &vi);
status = pviWrite(vi, (ViByte*) idn, 5, &retCnt); // Crash right here
status = pviRead(vi, (ViByte*) id, sizeof(id), &retCnt);
一切都很完美。但是,在调用pviWrite时,将三个设置功能中的任何一个更改为运行时链接会导致分段错误。 DLL没有将AFAIK导出的任何其他函数“设置全局变量”,实际上我看不到使用Dependency Walker工具导出的DllMain。有没有人成功连接到visa32.dll运行时?我在互联网上找不到任何例子。
答案 0 :(得分:1)
我怀疑你有以下问题:
http://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx
向下滚动到备注部分,然后查找“Visual C ++”:如果DLL包含_declspec样式的线程本地存储,则只能在Vista或更高版本中动态加载它。
我正在努力实现同样的目标,但显然,对于XP,我们只是运气不好......