delphi10中C函数的转换
我正在尝试将Windows的C代码转换为Delphi10代码 使用I成功转换某些函数:delphi10中C函数的转换,c,delphi,type-conversion,C,Delphi,Type Conversion,我正在尝试将Windows的C代码转换为Delphi10代码 使用I成功转换某些函数: typedef void* PaprikaTask; typedef void* PaprikaAuthToken; __declspec(dllexport) void paprika_set_apikey(const char* key); __declspec(dllexport) PaprikaAuthToken paprika_auth_create(); __declspec(dllexport
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\u正在运行来检查任务的工作情况。调用辣椒粉启动函数之前,它返回FALSE。调用paprika_start_函数后,它开始返回TRUE,但在1-2秒后(无论传输文件大小),它返回FALSE。
这意味着函数正在工作,但问题似乎出在参数中
请告诉我哪里出了问题
可能是从字符串到TWideChar的转换不正确。
或者目录的路径传递不正确,例如,使用了不正确的斜杠。我尝试了不同的途径:
('C:/'、'C:\'、'C:'、'file://C:'、'file://C:/'、'/'、'\'、''''
什么是不正确的?请帮忙。我需要你的帮助
这是错误的PChar
是PWideChar
的别名。类型应为PAnsiChar
另外,在传递文本时,不需要使用PAnsiChar
或PWideChar
强制转换。删除它们以简化代码
此外,在参数中使用
procedure paprika\u set\u apikey(键:PAnsiChar);cdecl;外部“sendanwhere.dll”
当你建议我删除PAnsiChar
和PWideChar
时,你会怎么想?您能否在此函数中给出一个示例:PaprikaTask paprika_create_下载(const wchar_t*key,const wchar_t*destDirPath)代码>它看起来像函数paprika\u create\u下载(key:Pointer;destDirPath:Pointer):paprikatash代码>?我没那么说。我说“你不需要PAnsiChar
或PWideChar
casts”。你知道演员是什么吗?如果没有,你应该查一下。我的意思是你不需要写PWideChar('correct_key')
,可以写'correct_key'
,这样函数就可以函数paprika\u create\u下载(key:PWideChar;destDirPath:PWideChar):paprikatash;cdecl;外部“sendanwhere.dll”
因为常量
没有任何用途,当您调用它时,您不需要强制转换文本。你知道什么是文字吗?再说一次,如果你不知道,你需要知道。这个术语很关键。非常感谢。我知道这是什么意思。这只是我糟糕的英语口译。很抱歉
procedure paprika_set_apikey(const key: PChar); cdecl; external 'sendanywhere.dll';