skymanrus, у меня есть исходники, где в DLL создаётся форма, есть внешняя функция, которая создаёт и показывает модальное окно, по окончанию работы с ней форма разрушается.
Так же научился передавать строковые типа и никакой модуль ShareMem не нужен)) Единственное, что ща не могу реализовать, так это создание немодального окна, ибо модальное окно стопорит процесс передачи пакетом в том скрипте, где она вызвалась и пока не завершишь работу с ней пакеты не проходят, я в частности делал так: при написание какого-либо сообщения в клиенте, я подгружал DLL и вызывал функцию, все норм, а после выгружал. Но мля, модальное окно не катит, нужен механизм немодального, я нашел его, но там требуется 2 параметра, которые я не могу в скрипте узнать: Application.Hadle основной программы (l2ph) и CallForm.Handle, в этом вся запара, попробую написать xkor может поможет, вообще я знаю уже способ, но он требует поправки исходного кода программы))
Вообще мог бы и сам наверно поправить, тока Delphi я щас юзаю 7 и компоненты не ставил таких как JEDI, на счет версии Delphi я мож и не прав :)
Код скрипта:
Код:
var
MyLib:Integer;
Res:Variant;
ar:array of variant;
begin
//38 - пакет когда вы пишите что нить в чат, не важно что и в какой, тут проверяется тока тип пакета )
if FromClient and (pck[1]=#$38) and (MyLib=0) then begin
MyLib := LoadLibrary('D:\Программы\l2phx318\MyLib\MyLib.dll'); //Здесь укажи свой путь до DLL
if (MyLib = 0) then ShowMessage('Не удалось загрузить библиотеку!')
else Res := CallFunction(MyLib,'ShowFormInDLL',1,['Мое окошко, че хочу, то и делаю с ним ^^']);
ShowMessage('Окошко должно было появится, а это сообщение выводится после того как вы его закрыли');
end;
if FromClient and (pck[1]=#$38) and (MyLib<>0) then
begin
ShowMessage('Попытка выгрузить библиотеку');
FreeLibrary(MyLib);
ShowMessage('Библиотека должна была выгрузится');
end;
end.
Код самой Dll:
Код:
library MyLib;
uses
ShareMem,
SysUtils,
Classes,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
exports
ShowFormInDLL;
begin
end.
Код Unit1, в котором описана форма, этот модуль подключён к основной DLL в разделе uses:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function ShowFormInDLL(Name: PWideChar): TModalResult; stdcall;
implementation
{$R *.dfm}
function PWideToString(pw: PWideChar): string;
var
p: PChar;
iLen: integer;
begin
iLen := lstrlenw(pw) + 1;
GetMem(p, iLen);
WideCharToMultiByte(CP_ACP, 0, pw, iLen, p, iLen * 2, nil, nil);
Result := p;
FreeMem(p, iLen);
end;
function StringToPWide(sStr: string; var iNewSize: integer): PWideChar;
var
pw: PWideChar;
iSize: integer;
begin
iSize := Length(sStr) + 1;
iNewSize := iSize * 2;
pw := AllocMem(iNewSize);
MultiByteToWideChar(CP_ACP, 0, PChar(sStr), iSize, pw, iNewSize);
Result := pw;
end;
function ShowFormInDLL(Name: PWideChar): TModalResult; stdcall;
begin
Form1 := TForm1.Create(Application);
Result := Form1.ShowModal;
Form1.Free;
end;
end.
Я этот код в самом начале писал, т.к. щас парюсь с показом немодульного окна, поэтому исходники скопировал сюда и тут ручками поправлял и не проверял, так что возможны какие-то опечатки или мелкие недочеты, если не пашет напишите, посмотрю исправлю, я делал у меня работало. :)
DLL руль и необходимое ее правильно подключить и взаимодействовать,т.к. скриптовая машина она конечно хороша, но не тягаться с языками программирования ей еще рано. :)