![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедура в библи-ке [D7, WinXP]
Adolf © (2005-07-20 00:32:00)Процедура в библи-ке не работает
procedure Test(Text: PChar);stdcall;
var s: PChar;
begin
s:='Testing';
Text:=s;
end;
Как можно в Text поместить s ?
Adolf (2005-07-24 00:03:00) [1]Спасибо за помощь!
Удачи вам всем...
Alexander Panov (2005-07-23 01:03:00) [2]Adolf (23.07.05 0:10) [10]
ShareMem - + лишняя библиотека
+22Кб.
Adolf (2005-07-23 00:10:00) [3]2Anatoly Podgoretsky ©
Я знаю... Просто по другому не напишиш... :)
Вот что я понял:
PChar - unsafe type
String - не работает
ShortString - слишком short
WideString - работает, но как в string переводить?
ShareMem - + лишняя библиотека
Хорошего выбора нет... :)
Anatoly Podgoretsky (2005-07-22 09:30:00) [4]Adolf (21.07.05 01:09) [5]
Процедуры не возвращают значений
evvcom (2005-07-22 09:21:00) [5]
> Зделай как в
> > Defunct © (20.07.05 02:32) [3]
Нет! Сделай как в API. Alexander Panov © (20.07.05 00:57) [2] показал как это правильно делается.
Adolf (2005-07-22 00:26:00) [6]А как в C++ написать эту же функцию? Просто я недавно начал писать на С++...
alex-drob (2005-07-21 01:47:00) [7]
> Adolf (21.07.05 01:09) [5]
Зделай как в
> Defunct © (20.07.05 02:32) [3]
Adolf (2005-07-21 01:09:00) [8]Извеняюсь, вопрос задал боком :)
Делаю плагин(макросы) для своей программы, т.е. в плагин поступает строка с текстом, плагин изменяет текст и возвращает измененный текст проге. Как это лучше сделать при том чтоб плагины можно было также писать на C++?
Defunct (2005-07-20 02:34:00) [9]и использовать String/ShortString
PChar - unsafe type, его не рекомендуется использовать
Defunct (2005-07-20 02:32:00) [10]> Как можно в Text поместить s ?
Поставить var?
procedure Test( varText: PChar);stdcall;
Alexander Panov (2005-07-20 00:57:00) [11]Напиши, что ты реально хочешь сделать.
Для твоего примера задачу можно решить примерно так:
1. В проект и в DLL в Uses первым модулем добавляешь ShareMem. В этом случае твоя функция будет работать без изменений.
2. Примерно так.
В DLL:
procedure Test(Text: PChar;Len: Integer);stdcall;
var
s: String;
begin
s := 'Testing';
s := Copy(s,1,Len-1); //Ограничение длины
StrPCopy(Text,s);
end;
В основной программе:
function GetStr: String;
var
ps: PChar;
begin
ReallocMem(ps,20);
try
Test(ps,20);
Result := Copy(ps,1,StrLen(ps));
finally
FreeMem(ps);
end;
end;
Это лишь общая идея. Принцип такой: где память выделяется(напр. в основной программе, там она и должна освобождаться).
alex-drob (2005-07-20 00:44:00) [12]А что не работает?