我在相当复杂的情况下获得了“访问违规阅读位置”的预期。让我解释。我有一个C代码,它使用包装器链接静态c ++库。该库使用另一个链接dll的静态库。为了使它更清晰,我会试着描绘它:
Can.c --->电话---> Wrapper.cpp(c ++库的包装器)
Wrapper.cpp --->电话---> Lib_For_Wrapping.lib(针对不同的hw类型的api)
Lib_For_Wrapping.lib --->从--->调用函数EG_presos_PAL.dll(由静态库EG_presos_PAL.lib链接)
现在,调用打开驱动程序和访问hw设备的功能。我得到了上面提到的例外。
/* Open the driver, access the hardware device. */
palRet = PAL_Startup(
&m_palSession,
m_palHwType,
"0",
m_palTtcFile,
true,
true);
if(palRet) {
m_talSession = PAL_NO_SESSION;
m_currentStatus = Can::BUSSTATUS_DRIVERERROR;
CIFERROR("PAL_Startup() failed with error code: " << static_cast<int>(palRet));
return false;
} else {
++sm_numInstances;
}
此函数的声明如下所示:
PAL_Startup(PAL_SessionHandleType * pSessionHandle,
PAL_ConnectionType eConnectionType,
const char * sDeviceName,
const char * sTtcFile,
PAL_Boolean bWaitUntilReady,
PAL_Boolean bCleanStartup);
不幸的是,我无法访问实现,但据我所知,我不会尝试取消引用任何空指针。由于实现在dll中,因此我可以看到对此函数的调用。最后一个callstack条目是KernelBase.dll中的DeviceIoControl。 任何想法都将不胜感激。