VC++6.0で発生するエラーの内容と対策

このQ&Aのポイント
  • VC++6.0で発生するエラーの内容と対策についてまとめました。
  • エラー内容は「The value of ESP was not properly saved across a function call」となっており、Function Call時のESPの保存方法が正しく行われていないことが原因です。
  • 解決策としては、呼び出し規約(calling convention)が異なる関数宣言と関数ポインタ宣言を用いている場合に発生するため、呼び出し規約を統一するか、適切な型にキャストする必要があります。
回答を見る
  • ベストアンサー

エラー内容について

お世話になっております。 現在、VC++6.0にてアプリを開発中です。 そこで、下記エラーが発生し、処理がうまく行きません。 エラーの内容と、対策をお教え下さい。 [エラー内容] Debug Error! Program:xxxxxxxxx.exe Module: File:i386\chkesp.c Line:42 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. (Press Retry to debug the application) エラー発生の場所は、GetProcAddressで、DLLの関数のアドレスを取得し、その関数をコールした結果で起こっています。 DLL内部にログ出力を入れた結果、DLLの関数自体は正常終了しています。 DLLの関数を取得している部分は下記の通りです。 typedef int (APIENTRY *LPGetRouteList)(WORD wdIn1, WORD wdIn2, WORD wdin3);   ・   ・   ・ LPGetRouteList lpGetRouteList;   ・   ・   ・ lpGetRouteList = (LPGetRouteList)GetProcAddress(hHandle,"GetRouteList); 関数を使用している部分は、下記の通りです。 int iRet = 0;   ・   ・   ・ iRet = lpGetRouteList(wdA, wdB, wdC); <- ここでエラーが発生 DLLの関数は以下の通りです。 extern WORD APIENTRY GetRouteList(WORD wdIn1, WORD wdIn2, WORD wdIn3) { WORD wdRet = 0;   ・   ・   ・  return(wdRet); } 以上、長文で見づらいと思われますが、なにとぞ宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmb01
  • ベストアンサー率45% (63/138)
回答No.1

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. ESPの値が関数呼出を通じて正しく保存されなかった. これは通常ある呼出規約で宣言された関数を それとは異なる呼出規約の関数ポインタで呼び出した結果である. したがって、 DLL側で本当にAPIENTRYがついているかをチェックし、 あとは関数の戻り値がintとWORDで不一致なのをWORDに統一して試してください.

参考URL:
http://ray.sakura.ne.jp/asm/9.html

関連するQ&A

  • Cabの解凍プログラム

    現在Cabの解凍をするプログラムを作っています。 Cabファイル内のファイル数を取得するために、 int WINAPI CabGetFileCount(LPCSTR szArcFile); というAPIを使おうとしているのですが、 実行中に、デバッグエラーが出ます。 エラーメッセージ The value ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention pointer declared with a different calling convention. ソースは以下のものです。 typedef bool (*TFUNC)(LPCSTR); void 関数名(HWND hWnd) { HINSTANCE hCab=NULL; //cab32.dllのインスタンスハンドル TFUNC DllFunction; int FileCount; //cab32.dllのロード hCab = LoadLibrary("cab32.dll"); if(hCab == NULL) { MessageBox(hWnd,"cab32.dllがありません。","エラー",MB_OK); return; } DllFunction=(TFUNC)GetProcAddress(hCab,"CabGetFileCount"); FileCount = (*DllFunction)("test.cab"); FreeLibrary(hCab); } (DLL使用テストのソース) コンパイラーは"VC++6.0" OSはWin2Kになります。 わかるかたよろしくお願いします。

  • DLLについて

    MFCを含むVC++で作られた関数をCで使えるようなDLLを作成しています。 MFC_FUNCTION→DLL(C)→exe(C) windowsXP上では、動作するのですがwindows2000上では下記エラーがでます。 「The variable "iRet" is being used without being defined」 ここで"iRet"はMFC_FUNCTIONで使われている変数です。 このエラーをなくしたいのですが、どうすればいいか教えて下さい。

  • エラーについて

    Visual studio net 2003 で list10-7というウィンドウズプログラム作ってDebugをしたところ、 error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "unsigned long __stdcall ThreadFunc(void *)" (?ThreadFunc@@YGKPAX@Z) と fatal error LNK1120: 1 unresolved externals という2つのエラーが出ました。ThreadFuncというのは自作のスレッド関数です。上記のエラーから、なんとなくtimeGetTime関数に何か問題があると思うのですが、全くわかりません。AlphaBlend関数を使うときライプラリmsimg32.dllを追加しましたが、timeGetTime関数も何かライプラリが必要なのでしょうか? 

  • 自作DirectShow Filterのinterface定義

    DirectShow Filterを自作しGraphEdit上で動作することを確認しました。 しかしC++プログラム上から独自定義のメソッドを呼び出すと 呼び出し元と先で呼び出し規約が異なるというエラーが出てしまいます。 定義は DEFINE_GUID(CLSID_MyClass, <<適当なGUID1>>); DEFINE_GUID(IID_IMyClass, <<適当なGUID2>>); MIDL_INTERFACE("<<適当なGUID2>>") IMyClass : public IUnknown {  STDMETHOD(myMethod)(void) PURE; }; class CMyClass : public CTransInPlaceFilter {  CMyClass ::CMyClass (IUnknown * pOuter, HRESULT * phr, BOOL ModifiesData);  CMyClass ::~CMyClass (); public:  static CUnknown *WINAPI CMyClass::CreateInstance(LPUNKNOWN punk, HRESULT *phr);  DECLARE_IUNKNOWN;  STDMETHODIMP CMyClass::myMethod(void){return S_OK;}; } 呼び出し元では DEFINE_GUID(CLSID_MyClass, <<適当なGUID1>>); DEFINE_GUID(IID_IMyClass, <<適当なGUID2>>); MIDL_INTERFACE("<<適当なGUID2>>") IMyClass : public IUnknown {  STDMETHOD(myMethod)(void) PURE; }; int main() {  CoInitialize(NULL);  IMyClass pMyClass;  CoCreateInstance(   CLSID_MyClass,   NULL,   CLSCTX_INPROC,   IID_IMyClass,   (LPVOID *)&pMyClass  );  pMyClass->myMethod();←ここでエラー  ・  ・  (略)  ・  ・ } エラーメッセージは 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. です。 どちらも__stdcallになってるはずなんですが… 原因が分かる方おられましたらよろしくお願いいたします。

  • 例外エラーについて2

    新規に質問します。 状況はエクセルなどのアプリを立ち上げた時に「例外エラー」が発生します。 以前にもこのような問題で修理に出しています。 いつもではありませんが、エクセル2000、ワード2000(というよりオフィス関係)を立ち上げた時に ブルーバックの例外エラーが発生します。 「例外ODがFFFF:0000FFFで発生」 どれかキーを押すとエクセルのみ終了します。 OSを再起動しないとエクセルは使えません。 エクセル、ワード(オフィス2000)に限ってです。 アドバイスに従い各種チエックし、下記のところへたどり着きました。 メーカーへは問い合わせ中ですが上記の現象と下記の関連が今一わかりません。 システムツールのシステム情報で ツール自動スキップドライバーエージェント 下記はその内容 「WINが応答しなくなったタスクCalling a Pnp BIOS>Get Statically Allocated Resorce information 詳細 Calling a PnP BIOS関数中に深刻なエラーが発生しました。 この問題の原因となったファンクション Get Statically Allocated Resorce information この問題の参照 0A 00 00 00 B8 03 F0 00 問題を解決するにはコンピューターの製造元に連絡してください。」 対処法は?

  • VC++6.0からVB.NETで作成した関数を呼ぶことができますか?

    VB.NET(Visual Basic 2005 Express Edition)でクラスライブラリ(AAA.dll)を作成し、BBBというModuleにCCCというFunctionをひとつ作成しました。 そのFunctionをVC++6.0で作成したプログラムから呼び出すことは可能でしょうか?また、可能な場合はどのような手順で呼び出すことができるのでしょうか? ■VB6.0でDLLを作成した場合 DLLのファイル名とFunction名さえ指定すればVC++6.0よりLoadLibrary、GetProcAddress関数を使用して呼び出せる。 ■VB.NETでDLLを作成した場合 DLLのファイル名+Module名+Function名という構成になってしまい、従来のLoadLibrary、GetProcAddress関数ではModule名が指定できないように思われるのですが・・・どうなんでしょう。 ご存知の方いらっしゃいましたらご教授お願いいたしますm(_ _)m

  • Error calling method ?

    インターネットをしようとすると Error calling method ってメッセージが クリックするたびに出てきて、 結局すぐIexploreが原因でINSTAFIN、DLL に エラーが発生しました、Iexploreを終了しますが 出てしまいます、 どうしたらいいでしょう…

  • CreateDCA、CreateDCWのパラメータ

    HDC CreateDC(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutPut, CONST DEVMODE *lpInitData)にはUnicode版とANSI版が実装されます よってCreateDCAでは HDC CreateDCA(PCTSTR lpszDriver, PCTSTR lpszDevice, PCTSTR lpszOutPut, CONST DEVMODE *lpInitData) CreateDCWでは HDC CreateDCW(LCPWSTR lpszDriver, LCPWSTR lpszDevice, LCPWSTR lpszOutPut, CONST DEVMODE *lpInitData) と定義されているのだと思い、上記の形式で呼び出しましたがエラーとなってしました 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 conversion with a function pointer declared with a different calling conversion. なぜCreateDCではなくCreateDCAとCrateDCWを直接呼び出すような面倒なことをしているかというと、APIフックでCreateDCを引っ掛けたいのです CreateDCはCreateDCA、CreateDCWになってしまうのでCreateDCではフック出来ません そこでCreateDCA、CreateDCWでフックして当方の処理を行い、その後で本来のCreateDCA、CreateDCWを呼び出しております ところが呼出し方が悪いらしく上記の英文エラーが出てしまいます CreateDCA、CreateDCWで検索したのですが適当な資料が見当たりません 目下のところ手も足も出ません CreateDCA、CreateDCWのパラメータ指定法(多分エラーの原因だろうと思っていますので・・・)をご存知でしたらご指導願います

  • VBAでDLLが見つからないエラー

    CADのVBA(6.0)ですが、DLLが見つからないエラーが出ます ' こっちはエラーが出ない Public Declare Function SearchVBApath Lib _ "C:\Program Files\AppliTool\VB\DDDD.dll" (ByVal env As String, ByVal s As String) As Integer 'こっちだとエラーが出る Public Declare Function SearchVBApath Lib "DDDD.dll" (ByVal env As String, ByVal s As String)    As Integer VBAプロジェクトファイルとDLLは同じフォルダにおいてあります 上記のようにフルパスだとエラーが出ないのですがDLL名だけだとこの関数のところでエラーがでます このDLL関数宣言行の前の方には他のDLL関数も同じようにパス省略で記述しているのですがそちらにはエラーが出ません どなたかヒント下さい、よろしくお願いします。

  • AfxLoadLibrary関数で、DLLのハンドルが取得できない

    はじめまして。 タイトルの通りですが、AfxLoadLibraryを使用して、DLLのハンドルを取得しようとしています。(取得したハンドルでGetProcAddress関数を使用する為) ここで、AfxLoadLibraryの戻り値となる、ハンドルがNULL(0x0000)となってしまい、GetProcAddressによる関数ポインタの設定が行えない状況となっています。 FormatMessage関数とGetLastErrorを使用し、原因を調べたところ、「指定されたモジュールが見つかりません」というメッセージとなりました。 AfxLoadLibraryで指定しているDLLについては、Exeファイルと同じフォルダ内に存在し、かつ、名前についても間違っていません。 試しに、別DLLを、上記NGとなるDLLと同様の名前で作成してみたところ、ハンドルの取得に成功したので、EXE側のコーディングミスという所は考えづらいところです。 お手数ですが、他の原因に心あたりがありましたらご教唆願います。 <コーディング(一部抜粋)> ---------------------------------------------------------------- HINSTANCE m_handle_Aaa; typedef WORD (WINAPI *LPOpenAaa)(); LPOpenAaa lpOpenAaa; BOOL DllLoad(void) { // Load Dll m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll"); if(m_handle_Aaa < (HINSTANCE)HINSTANCE_ERROR) { PutLastError(); // Error Message return FALSE; } // Get Function Pointer lpOpenAaa = (LPOpenAaa)GetProcAddress( m_handle_Aaa, "OpenAaa"); if(lpOpenAaa == NULL) return FALSE; ・ ・ ・ ----------------------------------------------------------------

専門家に質問してみよう