2016-06-21 19 views
-1

このヘッダーには、戻り値の型が3つある関数シグネチャがあるような複数行のコードが見つかりました(FTD2XX)。これをどうやって解釈するのですか?ここに例がありますC++で3つの戻り値の型を持つメソッドを解釈する

FTD2XX_API 
FT_STATUS WINAPI FT_Read(
         FT_HANDLE ftHandle, 
         LPVOID lpBuffer, 
         DWORD nBufferSize, 
         LPDWORD lpBytesReturned 
); 

すべての助けが大変ありがとうございます。

+0

これらの型はどこに宣言されていますか?彼らは何もないマクロ(例えば '#define FTD2XX_API')または関数の前に許可されたキーワード(' __stdcall'など)にマップすることができます – Tas

+0

関数には "3つの戻り値の型"がありません。 1。 'WINAPI'シンボルは、Windows APIヘッダーで定義されたプリプロセッサマクロです。他の2つのシンボルは、おそらくはプリプロセッサマクロでもあるが、FTD2XXヘッダーで定義されているので、それらのシンボルを見つけて、それらが何であるかを知る必要がある。私の推測では、 'FT_STATUS'はある種のマクロ(またはタイプエイリアス)であり、' FTD2XX_API'は 'declspec'コンパイラ指令です。 –

+0

FTD2XX_APIは#defineで与えられます。FTD2XX_API __declspec(dllimport)または#define FTD2XX_API __declspec(dllexport) –

答えて

5

実際の戻り型がちょうどFT_STATUSそれ自体である:APIのにコンパイルされている場合

#ifdef FTD2XX_EXPORTS 
#define FTD2XX_API __declspec(dllexport) 
#else 
#define FTD2XX_API __declspec(dllimport) 
#endif 

typedef ULONG FT_STATUS; 

FTD2XX_API__declspecディレクティブを使用して処理するDLLのインポート/エクスポートを定義するマクロですDLL、FTD2XX_EXPORTSは、DLL関数がエクスポートされるように定義されています。 APIが使用されているときは、FTD2XX_EXPORTSが定義されていないため、DLL関数がインポートされます。

#ifdef _MAC 
... 
#define WINAPI  CDECL 
... 
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) 
... 
#define WINAPI  __stdcall 
... 
#else 
... 
#define WINAPI 
... 
#endif 

だから、あなたの例の関数の宣言は、(同様にパラメータ型決議を含む。)これに解決するでしょう:

WINAPI

は、(Windowsシステム上で __stdcall)呼び出し規約に解決 windef.hでマクロです

__declspec(dllimport) 
unsigned long __stdcall FT_Read(
         void *ftHandle, 
         void *lpBuffer, 
         unsigned long nBufferSize, 
         unsigned long *lpBytesReturned 
); 

これらのタイプのマクロは、複数のコンパイラで使用される、および/またはDLLにコンパイルされるAPIで一般的ではありません。この場合、エクスポートされた関数は、実装と使用方法、ターゲットプラットフォーム、使用されるコンパイラによって異なる方法で宣言する必要があります(たとえば、__declspec(dllimport)/__declspec(dllexport)の代わりにextern/__exportを使用するコンパイラもあります)。

+0

うわー。これは本当に上を超えて行きました。どうもありがとうございました。 –

関連する問題