Показать сообщение отдельно
Старый 14.01.2008, 14:56   #20
Новичок
 
Регистрация: 15.11.2007
Сообщений: 19
Сказал Спасибо: 0
Имеет 1 спасибку в 1 сообщении
SWS
По умолчанию

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 руль и необходимое ее правильно подключить и взаимодействовать,т.к. скриптовая машина она конечно хороша, но не тягаться с языками программирования ей еще рано. :)
SWS вне форума   Ответить с цитированием