从C ++调用返回DLL跳过至少一个调用堆栈帧

时间:2016-01-29 00:26:40

标签: c++ dll callstack

我有一个奇怪的问题,当我调用DLL中的一个函数(由其他人制作的DLL)时,当函数返回时它不会返回到人们期望它的位置,即立即返回语句在调用函数的语句之后,但是在调用堆栈中更高的位置。我首先想到它可能是一个与调用约定相关的问题所以我尝试了所有非弃用的调用约定,但问题并没有消失。这是代码:

typedef LPXLOPER12 (WINAPI *LPFNDLLFUNC1)();

std::wstring LoadDllAndCallOneFunction()
{
    HINSTANCE hDLL;  // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1;  // Function pointer
    std::wstring retval(L"Error");

    hDLL = LoadLibrary(TEXT("C:/Program Files (x86)/SRLib/EcmUtils.xll"));
    if (hDLL != NULL)
    {
        lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "_ExcelFunctionSlot_0_0_5@0");
        if (!lpfnDllFunc1)
        {
            FreeLibrary(hDLL);
        }
        else
        {
            LPXLOPER12 uReturnVal = lpfnDllFunc1();  // <--- The return from this call goes somewhere high up in the call stack, it even leaves the WndProc message handler that calls this function
            retval = uReturnVal->val.str;
        }
    }
    else
    {
        DWORD ec;
        ec = GetLastError();
    }

    return retval;
}

它不会在我在函数调用之后设置的断点处中断,也不会返回retval值。

提前感谢您的帮助!

0 个答案:

没有答案