Run-Time Check Failure #0, The value of ESP was not properly saved 오류 해결
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
오류 원인:
함수 포인터의 원형을 정의하는 중 오류가 발생했습니다.
사실 네가 정의한 것은 틀림없지만, 컴파일러가 알지 못할 뿐이다. 왜냐하면 네가 호출한 dll 함수는 먼 함수이고, C 함수이기 때문이다. 컴파일러에게 그것이 c 함수라고 말해야 한다.그러면 이 함수를 정의할 때 한마디를 더할 수 있다.
FAR PASCAL 또는stdcall, 이거 OK.
구체적인 방법:
예를 들어, 반환 유형이 비어 있고 매개변수가 비어 있는 함수 포인터를 정의합니다.
typedef void (*LPFUN)(void);
이렇게 하면 확실히 우리 dll의 함수와 일치한다. 위에서도 말했듯이, 우리는 컴파일러에게 이것이 먼 C 함수라는 것을 알려야 한다.
typedef void (WINAPI *LPFUN)(void);
typedef void (__stdcall *LPFUN)(void);
typedef void (FAR PASCAL *LPFUN) (void);
위에서 이렇게 정의하면 OK입니다. 만약에 VC++를 사용한다면 첫 번째 정의를 사용하면 OK입니다.
여기에는 MFC(DLL)를 사용하는 방법이 나와 있습니다.
WIN32 DLL의 경우 WINAPI를 제거해야 합니다.stdcall, FAR PASCAL 매개변수WIN32 DLL의 기본 입고 방식은 이므로cedcall 방식, 아님stdcall 방식.
구체적인 조합 방식이 너무 많아서 어쨌든 오류의 원인을 알면 상응하는 함수가 일치하지 않는다는 것을 성명하면 된다.
DLL에서 함수 또는 클래스 구성원 함수를 호출하는 동안 오류가 발생했습니다.
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
함수 정의의 호출 규칙은 실제 호출 규칙과 다르다.컴파일러가 기본적으로 인 경우cdecl,stdcall 형식의 함수는 을 사용했습니다cdecl의 호출 규칙은 컴파일할 때 오류가 발생하지 않기 때문에 실행 중 이상이 발생했습니다.
그래서 함수 정의에서 호출 규칙을 설정하면 이 문제를 해결할 수 있다.
예: typedef void ( stdcall Foo) (int a)
오랫동안 코드를 쓰지 않았는데 하루에 몇 줄의 코드가 있다.
typedef int ( *PFUN)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); void CTestProcessMonitorDlg::OnBnClickedButton1() {//TODO: Add your control notification handler code here
//MessageBox(TEXT("Hello"), TEXT("Test"));
//typedef void (*pfv) ();
HMODULE hmod = ::LoadLibraryExW(TEXT("user32.dll"), NULL, 0);
if (hmod != NULL)
{
PFUN pFun= (PFUN)GetProcAddress(hmod, "MessageBoxW");
if (pFun != NULL)
{
pFun(m_hWnd, TEXT("Hello"), TEXT("Test"), MB_YESNO);
}
:FreeLibrary(hmod);
}
}
갑자기 다음 오류가 발생했습니다.
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
코드를 아래와 같이 바꾸면 문제가 없어진다
typedef int (WINAPI *PFUN)(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); void CTestProcessMonitorDlg::OnBnClickedButton1() {//TODO: Add your control notification handler code here
//MessageBox(TEXT("Hello"), TEXT("Test"));
//typedef void (*pfv) ();
HMODULE hmod = ::LoadLibraryExW(TEXT("user32.dll"), NULL, 0);
if (hmod != NULL)
{
PFUN pFun= (PFUN)GetProcAddress(hmod, "MessageBoxW");
if (pFun != NULL)
{
pFun(m_hWnd, TEXT("Hello"), TEXT("Test"), MB_YESNO);
}
::FreeLibrary(hmod);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.