Главная страница
    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.46 MB
Время: 0.037 c
7-1082889675
gyry
2004-04-25 14:41
2004.05.30
Вырубание компа


14-1083932563
Vovchik_A
2004-05-07 16:22
2004.05.30
С наступающим праздником !


4-1082532597
LAndrey
2004-04-21 11:29
2004.05.30
Работа с MSExcel в отдельном потоке


11-1072555653
Юрий Ж.
2003-12-27 23:07
2004.05.30
Thread?


3-1083104408
Chechen
2004-04-28 02:20
2004.05.30
SQL запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский