gpt4 book ai didi

在 Delphi 10 西雅图中转换 C 函数

转载 作者:行者123 更新时间:2023-11-30 20:23:27 27 4
gpt4 key购买 nike

我正在尝试转换 API SendAnywhere header file适用于 Windows 的从 C 到 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。这意味着该函数正在运行,但问题似乎出在参数中。

请告诉我哪里出错了?

可能从字符串TWideChar的转换不正确。或者目录的路径传递不正确,例如使用了不正确的斜杠。我尝试过不同的路径:

('C:/', 'C:\', 'C:', '文件://C:', '文件://C:/', '/', '\', '' )

什么是不正确的?请帮助。我需要你的帮助。

最佳答案

procedure paprika_set_apikey(const key: PChar); cdecl; external 'sendanywhere.dll';

这是错误的。 PCharPWideChar 的别名。类型应为 PAnsiChar

顺便说一句,传递文字时不需要 PAnsiCharPWideChar 转换。删除它们以简化代码。

此外,在参数中使用 const 的含义与 C++ 代码中的含义不同,并且在任何情况下在外部声明中都毫无意义。我个人会删除这些修饰符并将指针作为普通值参数传递。

关于在 Delphi 10 西雅图中转换 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com