1

この関数を使用しようとすると、このエラーが発生します

 void WSPAPI GetLspGuid( LPGUID lpGuid )
 {
    memcpy( lpGuid, &gProviderGuid, sizeof( GUID ) );
 }

エラー

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.

関数は次を使用して呼び出されます

HMODULE         hMod = NULL;
LPFN_GETLSPGUID fnGetLspGuid = NULL;
int             retval = SOCKET_ERROR;

// Load teh library
hMod = LoadLibraryA( LspPath );
if ( NULL == hMod )
{
    fprintf( stderr, "RetrieveLspGuid: LoadLibraryA failed: %d\n", GetLastError() );
    goto cleanup;
}

// Get a pointer to the LSPs GetLspGuid function
fnGetLspGuid = (LPFN_GETLSPGUID) GetProcAddress( hMod, "GetLspGuid" );
if ( NULL == fnGetLspGuid )
{
    fprintf( stderr, "RetrieveLspGuid: GetProcAddress failed: %d\n", GetLastError() );
    goto cleanup;
}

// Retrieve the LSPs GUID
fnGetLspGuid( Guid );
4

1 に答える 1

3

この実行時チェックは、関数宣言と実際の定義の間の不一致を防ぎます。コードをスタティック ライブラリまたは DLL にコンパイルするときに発生する可能性のある事故。一般的な不一致は、呼び出し規則、または渡される引数の数または型です。

靴はぴったりです。呼び出し規約を宣言する WSPAPI という名前のマクロがあります。通常、__cdecl または __stdcall に展開され、通常は __stdcall に偏ります。したがって、クライアント コードでこのマクロの値が間違っている可能性が非常に高くなります。このマクロを正しく設定する方法がわからない場合は、ライブラリの作成者に支援を求めてください。


編集後: 間違ったバージョンの DLL をロードしているという追加の障害モードがあります。また、LPFN_GETLSPGUID 関数ポインターの宣言が間違っており、WSPAPI マクロがありません。特に見えないので、それにお金をかけます。


コメントの後、情報はゆっくりと流れ込んでいます:

typedef void (*LPFN_GETLSPGUID) (GUID *lpGuid) として定義されます。

どちらが間違っているか、そうあるべきです

typedef void (WSPAPI * LPFN_GETLSPGUID)(GUID *lpGuid);

マクロを使用できない場合は、WSPAPI を __stdcall に置き換えます。

于 2013-06-04T00:52:04.313 に答える