![]() |
|
|
Регистрация | << Правила форума >> | 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. Не упало только потому, что агрумента всего два, и делфийная функция поэтому ничего не чистила, иначе бы стек полетел. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось 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
|
|||
|
|||
![]() Цитата:
|