Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Внизполучить результат из dll Найти похожие ветки
← →
dim- © (2004-05-18 09:58) [0]var getPassw:function(var user:pchar;var passw:pchar):pchar stdcall;
когда вызываю ее "strin:=getPassw(pchar(users),pchar(pasw));" она ругается что "Constant object cannot be passed as var parameter"
в чем ошибка?
← →
Reindeer Moss Eater © (2004-05-18 10:07) [1]В способе передачи параметров.
Компилятор же тебе уже все сказал
← →
PVOzerski © (2004-05-18 10:34) [2]>(var user:pchar;var passw:pchar)
Обрати внимание на эти var"ы. Они, вообще-то означают, что в ходе работы функции может быть изменено значение самих указателей. То есть, что будут переданы фактически не сами указатели, а указатели на них. Это называется "передача по ссылке". Код сгенерится примерно такой же, как для
type
ppchar=^pchar;
var getPassw:function(user:ppchar;passw:ppchar):pchar stdcall;
Понятно, что строковую константу, например, если параметр дан как var pchar, не передать. Подозреваю, что и результат конверсии string в pchar - тоже. Теперь вопрос: а действительно ли по логике работы функции параметры надо передавать именно по ссылке?
← →
Reindeer Moss Eater © (2004-05-18 10:37) [3]Если в DLL с переданными переметрами делается StrAlloc, то почему бы и нет?
← →
PVOzerski © (2004-05-18 10:49) [4]>Если в DLL с переданными переметрами делается StrAlloc, то почему бы и нет?
Потому что лучше так не делать. Если менеджер кучи у exe и dll общий (напр., ShareMem), проще использовать строки, а если они разные, то сами понимаете...
← →
Reindeer Moss Eater © (2004-05-18 11:02) [5]StrAlloc была приведена как частный пример.
DLL ведь может написана не на D и создавать Windows строку c нулевым терминатором, используя переданный PChar.
И интерфесное описание в виде var MyString : PChar вполне уместно
← →
dim- © (2004-05-19 01:37) [6]Так все-таки, можно передавать переменную через var или нет.
Мне необходимо вернуть из длл несколько значений
← →
Reindeer Moss Eater © (2004-05-19 08:55) [7]Не можно, а нужно.
А ты - не передаешь.
← →
Digitman © (2004-05-19 09:22) [8]в ДЛЛ :
function GetPassw (user, passw: pchar; MemMgr: PMemoryManager): PChar; stdcall;
begin
...
Result := MemMgr.GetMem(..);
try
...
except
MemMgr.FreeMem(Result);
Result := nil;
end;
end;
/////////////////////
в вызывающем коде :
type
TGetPassw = function (user, passw: pchar; MemMgr: PMemoryManager): PChar; stdcall;
var
MyMemMgr: TMemoryManager;
GetPassw: TGetPassw;
..
MyMemMgr.GetMem := @MyGetMem;
MyMemMgr.ReallocMem := @MyReallocMem;
MyMemMgr.FreeMem := @MyFreeMem;
strin:=GetPassw(pchar(users),pchar(pasw), @MyMemMgr);
if Assigned(strin) then
try
..
finally
MyMemMgr.FreeMem(strin);
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c