Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.036 c
3-1083926709
Саша
2004-05-07 14:45
2004.05.30
Поиск записи в таблице


11-1073169165
tbyte
2004-01-04 01:32
2004.05.30
KOL


1-1084480278
Idiliya
2004-05-14 00:31
2004.05.30
Насколько «резиновый» компонент Memo?


1-1084786460
Awod
2004-05-17 13:34
2004.05.30
Иконка приложения в WIN9X


1-1083835933
UnDISCOvery
2004-05-06 13:32
2004.05.30
Сравнение Delphi 5 и Delphi 7





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский