遅刻の「言い訳」選手権

お世話になっております。
現在、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);


}


以上、長文で見づらいと思われますが、なにとぞ宜しくお願いします。

A 回答 (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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報