2016-03-23 2 views
-2

Я пытаюсь преобразовать API SendAnywhere header file из кода C в Delphi 10 для Windows.Преобразование функций C в Delphi 10 Seattle

Использование 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); 

Это мое преобразование:

Пример из 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. Он возвращает FALSE перед вызовом paprika_start_function. Он начинает возвращать TRUE после звонка paprika_start_function, но через 1-2 секунды (независимо от размера передаваемого файла) он возвращает FALSE. Это означает, что функция работает, но, похоже, проблема в аргументах.

Пожалуйста, скажите мне, где я иду не так?

Может быть, есть некорректное преобразование из строки в TWideChar. Или путь к каталогу передается некорректно, например, и используется некорректная косая черта. Я пробовал разные пути:

('C: /', 'C: \', 'C:', 'file: // C:', 'file: // C: /', '/ ',' \ ',' ')

Что именно? Помоги пожалуйста. Мне нужна твоя помощь.

+0

FWIW, я рекомендую прочитать мою статью о таких преобразованиях, [Pitfalls of Converting] (http://rvelthuis.de/articles/articles-convert.html). Он обрабатывает эти вещи в глубину. –

+0

Спасибо! Удивительная статья! Есть много полезных вещей. Почему Google Search не нашел его раньше ... –

ответ

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

Это неправильно. PChar является псевдонимом PWideChar. Тип должен быть PAnsiChar.

В качестве альтернативы вам не нужны цифры PAnsiChar или PWideChar при передаче литералов. Удалите их, чтобы упростить код.

Кроме того, ваше использование const в параметрах имеет другое значение, отличное от кода в C++, и во всяком случае бессмысленно во внешней декларации. Я лично удаляю эти модификаторы и передаю указатели как простые значения.

+0

Thnx! Я модифицировал 1-ю функцию как: 'procedure paprika_set_apikey (клавиша: PAnsiChar); Cdecl; внешний 'sendanywhere.dll '; ' И чем вы мерите, когда советуете мне удалять' PAnsiChar' и 'PWideChar'? Не могли бы вы привести пример в этой функции: 'PaprikaTask paprika_create_download (Const wchar_t * ключ, Const wchar_t * destDirPath);' Будет ли это выглядеть как 'функция paprika_create_download (ключ: Pointer; destDirPath: Pointer): PaprikaTask;'? –

+0

Я этого не говорил. Я сказал: «Вам не нужны« PAnsiChar »или« PWideChar ». Вы знаете, что такое бросок? Если нет, вы должны посмотреть. Я имею в виду, что вам не нужно писать 'PWideChar ('correct_key')' и может писать '' correct_key'' –

+0

Так что функция может быть 'function paprika_create_download (ключ: PWideChar; destDirPath: PWideChar): PaprikaTask; Cdecl; external 'sendanywhere.dll'; 'поскольку' const' не имеет никакой цели, и, когда вы его называете, вам не нужно бросать литералы. Вы знаете, что такое буквальный? Опять же, если вы этого не знаете, вам нужно знать. Эта терминология имеет решающее значение. –

Смежные вопросы