Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

получить результат из 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.058 c
14-1084521390
Rule
2004-05-14 11:56
2004.05.30
Никто не знает ссылки на ресурс где храняться алгоритмики хорошие


3-1084334558
BanderLog_t
2004-05-12 08:02
2004.05.30
Вопрос по UDF в FB 1.5


4-1082023475
esVer
2004-04-15 14:04
2004.05.30
выделенный текст в чужом окне


7-1083182399
Mishenka
2004-04-28 23:59
2004.05.30
Очередь печати.


14-1084534455
Style
2004-05-14 15:34
2004.05.30
Какая то беда с Windows.SetTimer