【发布时间】:2016-03-23 17:52:22
【问题描述】:
我正在尝试将 API SendAnywhere header file 从 C 转换为适用于 Windows 的 Delphi 10 代码。
使用presented table of Embarcadero我成功转换了一些函数:
typedef void* PaprikaTask;
typedef void* PaprikaAuthToken;
__declspec(dllexport) void paprika_set_apikey(const char* key);
__declspec(dllexport) PaprikaAuthToken paprika_auth_create();
__declspec(dllexport) PaprikaAuthToken paprika_auth_create_with_deviceid(const char* id, const char* password);
__declspec(dllexport) void paprika_auth_close(PaprikaAuthToken auth);
__declspec(dllexport) bool paprika_is_running(PaprikaTask task);
__declspec(dllexport) PaprikaTask paprika_create_download(const wchar_t* key, const wchar_t* destDirPath);
__declspec(dllexport) void paprika_start(PaprikaTask task);
这是我的转换:
PaprikaAuthToken = Pointer;
PaprikaTask = Pointer;
procedure paprika_set_apikey(const key: PChar); cdecl; external 'sendanywhere.dll';
function paprika_auth_create: PaprikaAuthToken; cdecl; external 'sendanywhere.dll';
function paprika_auth_create_with_deviceid(const id: PAnsiChar; const password: PAnsiChar): PaprikaAuthToken; cdecl; external 'sendanywhere.dll';
procedure paprika_auth_close(auth: PaprikaAuthToken); cdecl; external 'sendanywhere.dll';
function paprika_is_running(task: PaprikaTask): Boolean; cdecl; external 'sendanywhere.dll';
function paprika_create_download(const key: PWideChar; const destDirPath: PWideChar): PaprikaTask; cdecl; external 'sendanywhere.dll';
procedure paprika_start(task: PaprikaTask); cdecl; external 'sendanywhere.dll';
SendAnywhere 的示例使用这些函数如下:
PaprikaTask pTask;
PaprikaAuthToken gToken;
paprika_set_apikey("YOUR_API_KEY");
gToken = paprika_auth_create();
pTask = paprika_create_download(L"KEY", L"/tmp");
paprika_set_auth(pTask, gToken);
paprika_start(pTask);
这就是我解释正确代码的方式:
var
FAuthToken: PaprikaAuthToken;
FOption: PaprikaOption;
paprika_set_apikey(PChar('my_correct_api_key'));
FAuthToken = paprika_auth_create();
// backslash for windows
FTask := paprika_create_download(PWideChar('correct_key'), PWideChar('\tmp')); //directory exists
paprika_set_auth(FTask, FAuthToken);
paprika_start(FTask);
我通过函数paprika_is_running检查了任务的工作。它在调用 paprika_start_function 之前返回 FALSE。它在调用 paprika_start_function 后开始返回 TRUE,但在 1-2 秒后(无论传输文件的大小)它返回 FALSE。 这意味着该函数正在运行,但似乎问题出在参数上。
请告诉我哪里出错了?
可能从 string 到 TWideChar 的转换不正确。 或者目录的路径传递不正确,例如使用了不正确的斜杠。我尝试了不同的路径:
('C:/', 'C:\', 'C:', 'file://C:', 'file://C:/', '/', '\', '' )
什么不正确?请帮忙。我需要你的帮助。
【问题讨论】:
-
FWIW,我建议阅读我关于此类转换的文章,Pitfalls of Converting。它深入处理这些事情。
-
谢谢!很棒的文章!有很多有用的东西。为什么 Google 搜索之前没有为我找到它...
标签: c delphi type-conversion