2013-04-16 79 views
1

我正在寫一個將導出函數和類的dll。但現在我有一個關於導出函數的問題。Win32 DLL導出函數參數最佳實踐

如果我的函數簽名看起來像:

__declspec(dllexport) int fn1(FILE *theFile); 

我應該包括這樣它定義文件?這裏最好的做法是什麼? 如果我想導出一個接受或返回自定義類型的函數,這些類型的頭文件是否也應該包含在導出的頭文件中?

+1

這聽起來像是關於一般頭文件的最佳實踐的問題,實際上與DLL或Windows沒有任何關係。 – jamesdlin

+0

請注意,如果跨多個模塊使用FILE *,則必須確保所有這些模塊使用相同的CRT DLL。 –

回答

5

不要轉發decl標準庫類型和函數。這是庫標題提供的。你的文件應當設置爲:

#ifndef MYLIBRARY_H 
#define MYLIBRARY_H 

#ifdef MYLIBRARY_EXPORTS 
#define MYLIBRARY_EXPORT __declspec(dllexport) 
#else 
#define MYLIBRARY_EXPORT __declspec(dllimport) 
#endif 

// required headers 
#include <stdio.h> 

// exported/imported functions 
MYLIBRARY_EXPORT int fn1(FILE *theFile); 

#endif 

你的DLL項目與MYLIBRARY_EXPORTS內置定義爲部分或定義的預處理宏(配置任意數量的方式),以及您的DLL的消費者做定義它。

這是MS用於其嚮導的DLL項目生成器的常見佈局。考慮在你的項目中也做同樣的事情。最重要的是,爲您的庫包含所需的標準頭文件,以便正確定義需要進入的內容以及它提供的內容。

+0

作爲問題,自定義類型如何? –

2

頭文件通常應該是自包含的。使用頭文件的客戶不必知道他們在包含自己的頭文件之前需要一些#include "xyz.h"行。 (而試想一下,如果其他xyz.h頭也做了同樣的事情,等等。你需要知道一個嚴格的順序對所有的頭文件,這將是一場噩夢。)

但是,你不一定需要#include您使用的某些類型的標頭。例如,您可能可以使用前向聲明。