从C代码调用的C ++库:访问冲突读取位置(KernelBase.dll)

时间:2014-08-05 11:41:15

标签: c++ c dll wrapper mixing

我在相当复杂的情况下获得了“访问违规阅读位置”的预期。让我解释。我有一个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。 任何想法都将不胜感激。

0 个答案:

没有答案