舊的庫是用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);
舊的庫是用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);
最大的問題是緩衝區。你的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>
。
@JensG不跨越互操作邊界。這會產生一個約束,即兩個庫都使用相同的動態運行時。 –
您正在假設情況。再次。但你可能是對的。 – JensG
@JensG好吧,使用'__stdcall'和提到庫使得我的假設看起來可能是有效的。你也正在假設背景。你假設這不是互操作性的。如果它不是互操作,那麼聲明是'void MyFunction(const std :: string&path,int&options,const std :: vector&data)' –