2016-11-01 6 views
1

VC++(VS2015)を使用してエクスポートされた単一の関数を使用して単純なDLLを作成し、この関数をWin32アプリケーションから呼び出しようとしています。私はx86とx64のビルド構成でdllとexeの両方をビルドすることをテストしています。vC++ 64ビットdllのパラメータサイズが正しくありません

x64としてコンパイルしてdll関数呼び出しに入ると、関数パラメータはすべてガベージデータです。

#ifdef CPPDLL_EXPORTS 
#define CPPDLL_API __declspec(dllexport) 
#else 
#define CPPDLL_API __declspec(dllimport) 
#endif 

extern "C" CPPDLL_API void __cdecl CallDll(LONG64 value, bool trueOrFalse); 

関数はDLLに実装され、この方法:

extern "C" CPPDLL_API void __cdecl CallDll(LONG64 value, bool trueOrFalse) 
{ 
    return; 
} 

IはDLLとアプリケーション・プロジェクトの両方に含まれているヘッダファイルに次のように関数が定義されています

これは、アプリケーションで関数が呼び出される方法です。

CallDll(12345, true); 

paraを変更するLONG64からintのようなものには何の違いもありません。私は愚かな間違いであることは間違いないが、私はそれを理解しようとしている私の髪を引き出している。

全体のサンプルプロジェクト: https://1drv.ms/u/s!AiwVLuwdzWP_zZ0tSDA15ZqL9QgKXQ

+0

[MCVE](http://stackoverflow.com/help/mcve) – NineBerry

+0

を追加しました全体MCVEプロジェクト – user7101086

+0

私はそれが最初に私をだますでしたHEADER.H を見つけるために、パスを含める変更した後、それは私のためにうまく働いを提供してください。実際にビルドされていた別のビルド構成のプロパティを変更することで(プラットフォームが間違っていて、x64をビルドしていて、Win32を変更していました) –

答えて

1

私はあなただけのデバッグで問題を抱えていると思います。私はそれが渡されたパラメータを表示持つようにDLL関数をこのように変更:

extern "C" CPPDLL_API void __cdecl CallDll(LONG64 value, bool trueOrFalse) 
{ 
    std::wstring s = std::to_wstring(value); 
    MessageBox(0, s.c_str(), L"Hello World", 0); 
    return; 
} 

メッセージボックスは、両方の32ビットに正しい値「12345」を構築するだけでなく、64ビット版のビルドを示しています。ここに示したように

は、それから私は、関数の先頭で2つのブレークポイントを置く:

enter image description here

を私が気づいたことは、私が最初のブレークポイントで壊れたときに、パラメータのために示された値であるということです間違っていて、64ビット用にコンパイルするとランダムに見えるが、32ビット用にコンパイルすると正しい。しかし、2番目のブレークポイントでブレークすると、両方の環境で値が正しくなります。

これはデバッガの問題です。デバッガが正しい値を表示するためには、関数の正確な最初の最初のブレークポイントが早すぎてヒットしたように見えます。

+0

Nit:LPCWSTRへのキャストは不要( 's'が実際には –

+0

@MartinBonnerええ、コード内で削除されました – NineBerry

+0

ありがとうございます。私はあなたが正しいと信じています。私は、デバッガを介してパラメータの値を調べていましたが、関数(またはブレークポイントあなたが推測したように、関数上に設定します)。 – user7101086

関連する問題