![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть код:
Код:
char szObjectName[] = "Clipboard";
int irPlg_GetPluginName(char* szBuffer, int* pnBufferSize)
{
// The proper name of the object as it will appear on the Plugins menu
int nLength = lstrlen(szObjectName);
if(*pnBufferSize < nLength)
{
*pnBufferSize = nLength;
return -1;
} else
{
memset(szBuffer,0,*pnBufferSize);
lstrcpy(szBuffer,szObjectName);
return nLength;
}
} |
|
#2
|
|||
|
|||
|
Код:
const
szObjectName : String = 'Clipboard';
function irPlg_GetPluginName(szBuffer : PChar; var pnBufferSize : Integer) : Integer;
var
nLength : Integer;
begin
nLength := Length(szObjectName) * SizeOf(Char); // To support unicode and non unicode
if pnBufferSize < nLength
Then
Begin
pnBufferSize := nLength;
Result := -1;
End
Else
Begin
FillChar(szBuffer,pnBufferSize,#0);
StrCopy(szBuffer,PCHAR(szObjectName));
Result := nLength;
End;
end;Как-то так, если не напутал с параметрами FillChar и StrCpy - проверь по документации. Последний раз редактировалось lmikle, 07.11.2015 в 23:34. |
|
#3
|
|||
|
|||
|
А то, что в параметрах функции вы используете не указатели, как в функции на C++, ничего страшного?
Эта функция будет экспортироваться в DLL. И, вроде как, программа, вызывающая эту функцию будет передавать в параметрах указатель на буфер. Последний раз редактировалось amspeople, 06.11.2015 в 10:30. |
|
#4
|
|||
|
|||
|
Если для DLL, то для полной совместимости надо заменить String на AnsiString.
Код:
const
szObjectName : AnsiString = 'Clipboard';
function irPlg_GetPluginName(szBuffer : PAnsiChar; var pnBufferSize : Integer) : Integer;
var
nLength : Integer;
begin
nLength := Length(szObjectName) * SizeOf(AnsiChar); // To support unicode and non unicode
if pnBufferSize < nLength
Then
Begin
pnBufferSize := nLength;
Result := -1;
End
Else
Begin
FillChar(szBuffer,nLength,#0);
StrCpy(szBuffer,PAnsiChar(szObjectName),nLength);
Result := nLength;
End;
end; |
|
#5
|
|||
|
|||
|
Вася, умный, да?
Читай код внимательно. 1. String используется только внутри модуля, наружу выдается PChar. 2. String использован именно для универсальности - поддерживается unicode и non-unicode версии. 3. Везде наружу "торчат" именно указатели: PChar - указатель на Char; var Integer в параметрах функции компилятором транслируется именно в указатель. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
amspeople (07.11.2015)
| ||
|
#6
|
|||
|
|||
|
lmikle, спасибо за код и разъяснения.
Один момент, Делфи 7 не знает функцию StrCpy. Может подключить в uses что надо? Спасибо. |
|
#7
|
|||
|
|||
|
Sorry, сейчас по справке проверил параметры и имена функций. По ходу, StrCpy я притащил из С-ей. Должно быть вот так:
Код:
FillChar(szBuffer,pnBufferSize,#0);
StrCopy(szBuffer,PCHAR(szObjectName)); |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
amspeople (08.11.2015)
| ||
|
#8
|
|||
|
|||
|
lmikle, что-то не работает как надо скомпилированная библиотека.
Когда я пытаюсь вызвать функцию irPlg_GetPluginName из другого языка программирования (lua), то в ее ответе я всегда получаю -1. Какой бы размер буфера я не передал вторым аргументом (даже записывал в буфер нужное число), он почему всегда меньше длины слова szObjectName. Т.е. постоянно срабатывает условие: Код:
if pnBufferSize < nLength then |
|
#9
|
|||
|
|||
|
А какое значение возвращается в pnBufferSize когда функция возвращает -1?
Есть еще один момент. Попробуй функцию описать вот так: Код:
function irPlg_GetPluginName(szBuffer : PAnsiChar; var pnBufferSize : Integer) : Integer; stdcall; |
|
#10
|
||||
|
||||
|
Цитата:
Значит, если в оригинальной сишной функции не было явно указано соглашение, то скорее cdecl, а не stdcall. Не упало только потому, что агрумента всего два, и делфийная функция поэтому ничего не чистила, иначе бы стек полетел. Последний раз редактировалось Bargest, 09.11.2015 в 01:20. |
|
#11
|
|||
|
|||
|
lmikle, с указанным соглашением stdcall, можно сказать, все заработало.
Если использовать это действие в коде: Код:
FillChar(szBuffer, pnBufferSize, #0); Код:
StrCopy(szBuffer, PCHAR(szObjectName)); Код:
FillChar(szBuffer, pnBufferSize, #0); Возникает вопрос, что не так с вышеуказанным действием? Upd. Отвечу сам. Верная запись кода будет выглядеть так: Код:
FillChar(szBuffer^, SizeOf(szBuffer), #0); Upd2. И подскажите, плиз, как отключить свободное перемещение курсора в редакторе. Достало уже.. Последний раз редактировалось amspeople, 09.11.2015 в 12:07. |
|
#12
|
|||
|
|||
|
Upd1.
Да, торможу, разименовать указатель надо. А вот SizeOf(szBuffer) - наверное, вернет правильный размер (ибо Дельфя слищком умная, хотя вот разименовать указатель в данном случае сама не смогла...), но лучше пользоваться переданным значением размера буффера, а именно - pnBufferSize. Т.е. выглядеть должно как-то так: Код:
FillChar(szBuffer^, pnBufferSize, #0); Upd2. Не понял в чем вопрос... где курсор перемещается??? В каком редакторе??? |
|
#13
|
|||
|
|||
|
Цитата:
|