Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-16680
}|{yk
2004-01-17 14:11
2004.02.06
Не работает клиент форума


4-16816
Вадим
2003-12-02 05:10
2004.02.06
Как убрать прозрачность окна?


4-16804
DDA2
2003-11-28 18:28
2004.02.06
Handle для папки


4-16822
kin_soft
2003-11-24 07:32
2004.02.06
WinApi wNetShareAdd где она в Дельфи?


9-16026
Vitas2
2003-07-22 16:17
2004.02.06
Попадание в цель





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