运行检查失败#0 – ESP的值未正确保存

我试图从C ++代码编译Excel自动化访问的例子,我得到以下错误:“运行时检查失败#0 – ESP的值没有正确保存跨函数调用。这通常是调用函数声明与一个调用约定与一个不同的调用约定声明的函数指针“。

我已经在互联网上发现并阅读了大量关于这个错误的信息,但是仍然无法明白我应该在代码中修复哪些信息才能使其工作。 请查看代码:

#include <windows.h> #include <oleacc.h> #import "C:\Program Files (x86)\Common Files\microsoft shared\OFFICE14\MSO.DLL" no_implementation rename("RGB", "ExclRGB") rename("DocumentProperties", "ExclDocumentProperties") rename("SearchPath", "ExclSearchPath") #import "C:\Program Files (x86)\Common Files\microsoft shared\VBA\VBA6\VBE6EXT.OLB" no_implementation #import "C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.EXE" rename("DialogBox", "ExclDialogBox") rename("RGB", "ExclRGB") rename("CopyFile", "ExclCopyFile") rename("ReplaceText", "ExclReplaceText") BOOL EnumChildProc(HWND hwnd, LPARAM) { WCHAR szClassName[64]; if(GetClassNameW(hwnd, szClassName, 64)) { if(_wcsicmp(szClassName, L"EXCEL7") == 0) { //Get AccessibleObject Excel::Window* pWindow = NULL; HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, __uuidof(Excel::Window), (void**)&pWindow); if(hr == S_OK) { //Excel object is now in pWindow pointer, from this you can obtain the document or application Excel::_Application* pApp = NULL; pApp = pWindow->GetApplication(); pWindow->Release(); } return false; // Stops enumerating through children } } return true; } int main( int argc, CHAR* argv[]) { //The main window in Microsoft Excel has a class name of XLMAIN HWND excelWindow = FindWindow(L"XLMAIN", NULL); //Use the EnumChildWindows function to iterate through all child windows until we find _WwG EnumChildWindows(excelWindow, (WNDENUMPROC) EnumChildProc, (LPARAM)1); return 0; } 

 EnumChildWindows(..., (WNDENUMPROC) EnumChildProc, ...); 

那(WNDENUMPROC)投了就停止了编译器告诉你,你做错了。 这并没有阻止你做错了。 固定:

 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM) { // etc.. } 

注意添加的CALLBACKmacros,它为callbackselect所需的__stdcall调用约定。 没有它,它默认为__cdecl,另一个调用约定要求调用者在调用之后清理堆栈。 这将不会发生,从而不平衡的堆栈。

这里logging了适当的callback签名。

 BOOL EnumChildProc(HWND hwnd, LPARAM) 

需要是:

 BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM)