2013-10-15 48 views
1

舊的庫是用Delphi編寫的。現在我試圖用C++編寫庫。Delphi函數和C++中的等效函數

下面有功能在Delphi的庫:

function MyFunction(Path:string; Options:PInteger; var Data: array of Byte):Integer; stdcall;

如何把這個函數查找在C++?低於申報權?

int __stdcall MyFunction(char* Path, int* Options, char* Data);

回答

2

最大的問題是緩衝區。你的Delphi函數傳遞一個開放數組。這是通過傳遞數組長度和指向第一個元素的指針來實現的。您的C++翻譯不會這樣做。您需要傳遞一個指定數組長度的額外參數。

由於您可以預料該功能不會修改Path您可能會聲明第一個參數爲const char*

因此,該功能會再看看這樣的:

int __stdcall MyFunction(const char* Path, int* Options, size_t len, char* Data); 

現在,如果你期待的功能是爲二進制互換與你有問題原來C++版本。你需要匹配Delphi開放數組的內部實現。你可以做到這一點。該功能將成爲:

int __stdcall MyFunction(const char* Path, int* Options, char* Data, int high); 

注意,長度參數出現在指針的第一個元素之後,並命名爲高。這是因爲德爾福開放數組收到high(A)而不是Length(A)

你真的必須擺脫在特定類型的Delphi間傳遞跨越界限的習慣。

當然,我在這裏假設您仍在創建一個用於互操作的庫,並且此函數位於互操作邊界處。如果函數是內部函數,那麼聲明可能是:

void MyFunction(const std::string &path, int &options, 
    const std::vector<char> &data); 

不需要返回值,因爲錯誤可以用例外信號發送。字符串存儲在std::string中,並且C++中的字節數組爲std::vector<char>

+0

@JensG不跨越互操作邊界。這會產生一個約束,即兩個庫都使用相同的動態運行時。 –

+1

您正在假設情況。再次。但你可能是對的。 – JensG

+0

@JensG好吧,使用'__stdcall'和提到庫使得我的假設看起來可能是有效的。你也正在假設背景。你假設這不是互操作性的。如果它不是互操作,那麼聲明是'void MyFunction(const std :: string&path,int&options,const std :: vector &data)' –