プロが教えるわが家の防犯対策術!

現在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;

intFileCount;

//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になります。

わかるかたよろしくお願いします。

A 回答 (3件)

>それは


>"typedef"にということでしょうか?
>そこにWINAPIをつけるとコンパイル時にエラーが出ることを確認しています。

(^^;;
#1の方の定義の仕方が間違ってるんですけど。
正しくは
typedef int (WINAPI * TFUNC)(LPCSTR);

と括弧の中に入れる必要があります。


また、"WORD WINAPI CabGetVersion(VOID);"
は利用することができるのですが、これの場合はWINAPIは不要で動きました。

WINAPIというか__stdcallは、引数のスタックへのつみ方を定義するキーワードです。なので、voidの場合は動いたんでしょう。
    • good
    • 0
この回答へのお礼

無事解決できました!ありがとうございました!

お礼日時:2004/11/17 15:13

ちゃんとWINAPIもつけました?

この回答への補足

それは
"typedef"にということでしょうか?
そこにWINAPIをつけるとコンパイル時にエラーが出ることを確認しています。

また、"WORD WINAPI CabGetVersion(VOID);"
は利用することができるのですが、これの場合はWINAPIは不要で動きました。

補足日時:2004/11/16 23:27
    • good
    • 0

int WINAPI CabGetFileCount(LPCSTR szArcFile);


と宣言されているのだから
typedef int WINAPI (*TFUNC)(LPCSTR);
では?

この回答への補足

失礼しました。他のCABのSDKに入ってるAPIを確かめたのがそのままになってました。
int に直しても、状態はかわらずです。

補足日時:2004/11/16 18:31
    • good
    • 0

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