Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.028 c