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

Вниз

InnoSetup   Найти похожие ветки 

 
k2 ©   (2004-01-28 07:01) [0]

Каким образом правильно вернуть строку из dll в скрипте для InnoSetup(4.1.1.)?

в supp2004.dll:

function PathToTralala:string; stdcall;
begin
Result:="Tralala";
end;


в скрипте:

[CODE]
function PathToTralala:String;
external "PathToTralala@files:supp2004.dll stdcall";

function NextButtonClick(CurPage: Integer): Boolean;
var
p: string;
begin
case CurPage of
wpFinished:
begin
p := PathToTralala;
MsgBox(p, mbInformation, MB_OK);
end;
end;
Result := True;
end;


строка возвращается но после MsgBox"а сообщение об ошибке:
Invalid Pointer Operation.


 
Digitman ©   (2004-01-28 08:47) [1]

ты хэлп к InnoSetup читал ?
вник в содержание темы, в которой идет речь о загрузке внешних DLL и вызове эксп. ими ф-ций ?

см. внимательно LoadDLL и CallDLLProc


 
k2 ©   (2004-01-28 08:59) [2]

to Digitman:
вы говорите о динамической загрузке dll, не вижу никакого криминала в попытке передать строку при статической :)
хэлп читать умеем, просто любопытно было :)


 
Digitman ©   (2004-01-28 09:08) [3]


> вы говорите о динамической загрузке dll


да хоть бы и статической ! суть совершенно не в этом


> не вижу никакого криминала в попытке передать строку


а я вижу.
DLL при инициализации/работе использует свой собственный экз-р менеджера памяти, в то время как PascalScript-интерпретатор, входящий в состав IS3 - свой. Отсюда и грабли.


 
Digitman ©   (2004-01-28 09:14) [4]

к тому же в режиме интерпретации ни о какой статической загрузке PE-модулей речи вообще идти не может


 
k2 ©   (2004-01-28 12:21) [5]

Вопрос по использованию функции CallDllProc:
function CallDLLProc(const DLLHandle: Longint; const ProcName: String; const Param1, Param2: Longint; var Result: Longint): Boolean;
Description:
Calls the specified function in a DLL specified using the DLL handle returned by LoadDLL. Returns True is the procedure was called successfully, False otherwise.
The function must use the standard calling convention, accept two 4 byte integer parameters and return a 4 byte integer result.

первые два параметра для вызова GetProcAddress, а што означают Param1 и Param2? Param1 используется при вызове DllProc но смысл непонятен :(
И ещё в этом процессе должно CastIntegerToString(const L: Longint): String; какимто образом участвовать?

to Digitman: насчет статической и динамической загрузки - наверное вы правы, но во всяком случае в моем примере объявление function PathToTralala:String;
external "PathToTralala@files:supp2004.dll stdcall";
и импорт через LoadProc достаточно похожи со соответствующими дельфийскими функциями, поэтому и были так названы,лмд мне


 
Digitman ©   (2004-01-28 12:37) [6]


> k2 © (28.01.04 12:21) [5]


видишь ли, я некоторым образом упустил факт использования тобой именно IS4 ... у меня этой версии не было до сего момента, а в имеющейся у меня IS3 выкрутасы со "статикой" и произвольной декларацией и вызовом внешних ф-ций не предусмотрены ... потому и заострил твое внимание на CallDllProc(), имеющую ощутимые ограничения по сравнению с возможностями IS4 по вызову внеш.ф-ций с произвольным числом и типом параметров

так что, м.б. и нет смысла использовать CallDllProc - она оставлена, очевидно, для совместимости со скриптами, написанными в IS3

а теперь вернемся к нашим баранам ..

так или иначе, но возврат из dll-ф-ции результата типа AnsiString (именно как large-type-строки) допустим и корректен ТОЛЬКО в случае использования ShareMem-соглашения И вызывающим И вызываемым кодом. Факт получения тобой упомянотого исключения говорит сам за себя : или хост-приложение или DLL или и то и другое одновременно не придерживаются этого соглашения.


 
k2 ©   (2004-01-28 13:28) [7]

> Digitman © (28.01.04 12:37) [6]
мы придерживались :)

var buff:PChar;
function GetPath: PChar;
var
s: array[0..255] of Char;
begin
GetMem(buff,256);
buff:=StrPCopy(s,"Tralala");
Result:=buff;
end;
procedure FreeBuff;
begin
FreeMem(buff);
buff:=nil;
end;
exports
GetPath,
FreeBuff;
...


//почемуто думала што в скрипте pchar не поддерживается :((((
function GetPath: PChar;
external "GetPath@files:supp2004.dll stdcall";
procedure FreeBuff;
external "FreeBuff@files:supp2004.dll stdcall";
...
MsgBox(GetPath, mbInformation, MB_OK);
FreeBuff;


ошибка теперь возникает при попытке очистить память,
пробовала и buff локально объявлять в getpath а потом
в freebuff передавать через параметр - :( "Could not call proc"


 
Digitman ©   (2004-01-28 13:46) [8]


> k2 © (28.01.04 13:28) [7]



> мы придерживались


вы-то, может, и придерживались, а вот придерживались ли разработчики IS4 - не знаю ... для этого следует просто залезть в исходники Pascal-интерпретатора от IS4 (благо свободно распространяются) и убедиться, что скорей всего НЕ придерживались

теперь - по GetPath + FreeBuff ...

а , собссно, зачем ?

пусть вызывающий код САМ выделит память и сам ее освободит !

а ф-ция GetPath() пусть принимает два параметра : адрес заранее подготовленного вызывающим кодом буфера и его размер ... а возвращает int-значение, показывающее сколько байт реально скопировано вызванным кодом в этот буфер ...

что-то вроде такого :

function GetPath(Buf: PChar; BufSize: Integer): Integer; stdcall;

тогда вызывающий код будет выглядеть примерно так :

var
BufStr: String;
RetLength: Integer;
...

Setlength(BufStr, MAX_PATH);
RetLength := GetPath(PChar(BufStr), MAX_PATH);


 
k2 ©   (2004-01-28 14:03) [9]

Digitman © (28.01.04 13:46) [8]
спасибо :))) удачи Вам



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
11-16201
Nomadic
2003-05-21 14:18
2004.02.06
Нет иконки в заголовке формы под KOL 1.73


14-16629
ИМХО
2004-01-13 02:18
2004.02.06
По поводу Mozilla


14-16621
asdqwer
2004-01-14 08:26
2004.02.06
HTML


14-16710
Ломброзо
2004-01-15 21:14
2004.02.06
Злой президент, обиженная женщина и добрые чечены


1-16382
Ivolg
2004-01-20 09:15
2004.02.06
Буфер!