delphi10中C函数的转换

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

我正在尝试将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) 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
强制转换。删除它们以简化代码


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

FWIW,我建议您阅读我的关于这种转换的文章。它能深入处理这些事情。谢谢!真棒的文章!有很多有用的东西。为什么谷歌搜索没有更早地为我找到它…Thnx!我将第一个函数修改为:
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';