- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 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 文件的 stub 。
这就是我动态链接到导出函数的方式:
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 没有将任何其他函数导出到“设置全局变量”,事实上我看不到使用 Dependency Walker 导出的 DllMain。工具。有没有人在运行时成功链接到 visa32.dll?我在 Internet 上找不到任何示例。
最佳答案
我怀疑你有以下问题:
http://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx
向下滚动到备注部分,查找“Visual C++”:如果 DLL 包含 _declspec 样式的线程本地存储,您只能在 Vista 或更高版本中动态加载它。
我正在努力实现同样的目标,但显然,对于 XP,我们只是运气不好......
关于c++ - 动态链接到 visa32.dll 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12381006/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!