2011-08-12 20 views
2

で迷子に私は機能LoadLibraryEx:パラメータが64ビット

int CShellWrapperx64Module:function(wchar_t* file, VARIANT &htmlFile, wchar_t* path) { 
    VariantInit(&htmlFile); 
    htmlFile.vt = VT_BSTR; 
    htmlFile.bstrVal = ::SysAllocString(L""); 
    return 0; 
} 

関数を呼び出し、64ビット、DLLとして実装されて

__cdecl int (*function)(IN wchar_t* file, OUT VARIANT &htmlFile, IN wchar_t* path); 

をエクスポートする64ビット-DLLを持っています

function pfunction = (function)GetProcAddress(hMod, MAKEINTRESOURCEA(0x0001)); 
TCHAR m_file[MAX_PATH]; 
VARIANT vhtml; 
VariantInit(&vhtml); 
pfunction(m_file, vhtml, path); 

32ビットモードでは、関数呼び出しは成功しますが、64ビットモードでは関数エントリポイントに達しますが、パラメータar無効ですか?私は何ができますか? x64ので

+0

これは、コードサンプルに含まれておらず、あなたの 'GetProcAddress'呼び出しが成功したとすれば' LoadLibraryEx'と正確に何が関係していますか? – Necrolis

+0

x64に__cdeclがないという事実に関連しているかもしれませんか? – hamstergene

答えて

0

__cdecl慣習のようなものはありません、(また、あなたが:functionようにそこにいくつかのコンパイラ固有の拡張機能を持っているようだ)あなたはx86-32用に正しく分岐させる必要があると思い、thisを見るとx86-64のビルド。私はあなたが呼び出しているdllが正しくx64用にコンパイルされていないと思う(デバッガはあなたにもっと決定的な答えを与えるだろう)。

2

あなたは静的関数として宣言しましたが、実際にインスタンスメソッドであるというオッズは素晴らしいです。 このポインタはレジスタに渡され、スタックには渡されないため、x86では偶発的に動作します。あなたは引数が異なる方法で渡されるため、x64で不運になりました。すべてがレジスタに渡され、呼び出し元と呼び出し先が一致しなくなりました。 GetProcAddressを使用したため、リンカーがビルド時にこの問題を診断するのに役立つ方法はありません。

固定を宣言してください。

関連する問題