Конференция "Основная" » DLL немодальный вызов, MDI [D7, Win2k, WinXP]
 
  • Сергей М. © (13.03.08 16:52) [60]
    Тебе что, сложно выложить тестовый проект здесь ?

    Там всего-то два-три десятка строчек)
  • IntruderLab (13.03.08 16:58) [61]
    не проблема :) выкладываю
    unit UfrmMain;

    interface

    uses
     ShareMem, Windows, Messages, SysUtils,
     Variants, Classes, Graphics,
     Controls, Forms,
     Dialogs,
     ComCtrls, Menus,
     ADODB,
     DB,
     DBTables,
     SConnect,
     Sockets,
     DBClient,
     MConnect, StdCtrls, ImgList, jpeg, ExtCtrls,
     Registry, Buttons, OleCtrls, SHDocVw, IdBaseComponent, IdComponent,
     IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, JvExStdCtrls,
     JvMemo, JvDotNetControls, JvExControls, JvComponent, JvEditorCommon,
     JvUnicodeEditor, JvUnicodeHLEditor, JvaScrollText, JvCheckBox,
     IdAntiFreezeBase, IdAntiFreeze, JvRichEdit,
     Consts, ConvUtils, Math, SyncObjs, ComObj, UfrmAbout, StrUtils,
     URemoteReadNews,
     URemoteKKMSettings,
     IdFTP,
     IniFiles, frxClass, JvEdit, ToolWin, DBCtrls, JvDBDotNetControls,
     JvScrollMax, JvExExtCtrls, Grids, JvListBox, ShellAPI, ActnList, Tabs;

    type
     TfrmMain = class(TForm)
       status: TStatusBar;
       menu: TMainMenu;
       frmReg: TMenuItem;
       mnuLogOn: TMenuItem;
       mnuVvod: TMenuItem;
       mnuNotes: TMenuItem;
       mnuReports: TMenuItem;
       mnuOSV: TMenuItem;
       mnuNumerators: TMenuItem;
       mnuhLIST_FACTORY_FILIAL: TMenuItem;
       mnuhLIST_TYPE_DOCUMENTS: TMenuItem;
       mnuhLIST_DOCUMENT_NUMERATOR: TMenuItem;
       mnuhLIST_ROLE: TMenuItem;
       mnuWorkers: TMenuItem;
       iList: TImageList;
       mnuClientShow: TMenuItem;
       mnuTourOperators: TMenuItem;
       mnuShowDocuments: TMenuItem;
       mnuSettings: TMenuItem;
       mnuKKMServer: TMenuItem;
       mnuXReport: TMenuItem;
       mnuZReport: TMenuItem;
       tcp: TTcpClient;
       IdAntiFreeze1: TIdAntiFreeze;
       N6: TMenuItem;
       mnuCloseSeans: TMenuItem;
       N1: TMenuItem;
       ftp: TIdFTP;
       mnuTourOperatorList: TMenuItem;
       mnuUserNotes: TMenuItem;
       mnuLIST_COUNTRY: TMenuItem;
       mnuLIST_CITY: TMenuItem;
       N8: TMenuItem;
       mnuLIST_HOTELS: TMenuItem;
       mnuAnalitica: TMenuItem;
       frmKKMFunction: TMenuItem;
       N5: TMenuItem;
       mnuChangeOrderClient: TMenuItem;
       mnuInsertPay: TMenuItem;
       mnuGetPay: TMenuItem;
       N2: TMenuItem;
       aList: TActionList;
       aEsc: TAction;
       Panel1: TPanel;
       N3: TMenuItem;
       ts: TTabSet;
       sm1: TJvScrollMax;
       JvScrollMaxBand2: TJvScrollMaxBand;
       lblKKMHost: TLabel;
       lblKKMPort: TLabel;
       JvScrollMaxBand3: TJvScrollMaxBand;
       lblGetLocalIP: TLabel;
       lblClientHostName: TLabel;
       JvScrollMaxBand5: TJvScrollMaxBand;
       Label1: TLabel;
       Label2: TLabel;
       dtpBegin: TDateTimePicker;
       dtpEnd: TDateTimePicker;
       smTypeDocuments: TJvScrollMaxBand;
       ckOrders: TCheckBox;
       ckInvoice: TCheckBox;
       ckAnnulOrders: TCheckBox;
       ckPays: TCheckBox;
       ckTours: TCheckBox;
       ckSortDate: TCheckBox;
       mnuDocumentsNM: TMenuItem;
       mnuProgramParameters: TMenuItem;
       ckUpdates: TCheckBox;
       ckNews: TCheckBox;
       Panel2: TPanel;
       txtNews: TMemo;
       
       procedure mnuDocumentsNMClick(Sender: TObject);
     private

     public
       //Наборы данных подключения к серверу и пользовательских параметров
       slServer       : TStringList;
       slUser         : TStringList;
       //Параметры удаленного сервера
       sServerAddress : String;
       sServerName    : String;
       sServerPort    : String;
       sServerGUID    : String;
       sInterceptGUID : String;
       sServerBegin   : String;
       sServerEnd     : String;
       //Параметры ККМ
       sKKMCode       : String;
       //Даты текущего периода
       sBegin, sEnd   : String;
       //Параметры фильтрации документов
       sOrders, sInvoice, sAnnulOrders, sTours, sPays, sDateSort, sDogTour, sZayavkaTour, sUpdates, sNews : String;
       //Поток считывания версий системы
       coRemoteKKMSettings : TRemoteKKMSettings;
       //Параметры локального компьютера
       sHost          : String;
       //Параметры пользователя
       sUSER_ID          : String;
       sUSER_NICKNAME    : String;
       sUSER_PASSWORD    : String;
       sUSER_FULLNAME    : String;
       sUSER_FILIAL_ID   : String;
       sUSER_KKM_USE     : String;
       sUSER_IS_ADMIN    : String;
       sUSER_FILIAL_NAME : String;
       sUSER_ROLE_ID     : String;
       sUSER_DOVERENNOST : String;
       sUSER_TOURS       : String;
       sSESSION          : String;
     end;

     function AddLog(sText:String):Longint;StdCall;external'events.dll';

    var
     frmMain: TfrmMain;

    implementation

    {$R *.dfm}

    //******************************************************************************
    procedure TfrmMain.mnuDocumentsNMClick(Sender: TObject);
    var LibHandle       : THandle;
       ShowDocumentsNM : function (slServer,slUsers:TStringList):Integer;StdCall;
    begin
     LibHandle := LoadLibrary('iHercules.dll');
     if LibHandle <> 0 then
     begin
       @ShowDocumentsNM := GetProcAddress(LibHandle,'ShowDocumentsNM');
       ShowDocumentsNM(slServer,slUser);
     end;
     FreeLibrary(LibHandle);
    end;
    //******************************************************************************
    end.

    dll
    library iHercules;

    uses
     ShareMem,
     ActiveX,
     Windows,
     Messages,
     SysUtils,
     Variants,
     Classes,
     Graphics,
     Controls,
     Forms,
     Dialogs,
     ComCtrls,
     Menus,
     ADODB,
     DB,
     DBTables,
     SConnect,
     Sockets,
     DBClient,
     MConnect,
     Registry,
     DateUtils,
     Math,
     UfrmShowDocuments in 'UfrmShowDocuments.pas' {frmShowDocuments};

    {$R *.res}

    //******************************************************************************
    function ShowDocumentsNM(slServer,slUsers:TStringList):Integer;StdCall;
    var frmShowDocuments : TfrmShowDocuments;
    begin
       try
     Application.CreateForm(TfrmShowDocuments,frmShowDocuments);
     except
       on E:Exception do ShowMessage(E.ClassName + ' ' + E.Message);
     end;
    end;
    //******************************************************************************
    exports
     ShowDocumentsNM;
    //******************************************************************************
    begin
    end.
    //******************************************************************************
  • Сергей М. © (13.03.08 17:04) [62]
    Это, ты считаешь, тестовый проект, да ?)

    И я во всем этом хламе должен разбираться ?)

    Убирай нафих из всех форм все !
    И никаких лишних юнитов в проектах не должно быть, только действительно необходимые для теста !
    Формы должны быть девственно чистыми !

    ShareMem убрать к лешему везде ! Мало того , что не знаешь зачем оно надо, да еще и влупил его в хост-проекте совсем не туда, куда требует документация.
  • IntruderLab (13.03.08 17:24) [63]
    unit UfrmMain;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, Menus;

    type
     TfrmMain = class(TForm)
       menu: TMainMenu;
       mnuTest: TMenuItem;
       procedure mnuTestClick(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     frmMain: TfrmMain;

    implementation

    {$R *.dfm}
    //******************************************************************************
    procedure TfrmMain.mnuTestClick(Sender: TObject);
    var LibHandle : THandle;
       ShowChild:function :Longint;StdCall;
    begin
     LibHandle := LoadLibrary('dll.dll');
     if LibHandle <> 0 then
     begin
       @ShowChild := GetProcAddress(LibHandle,'ShowChild');
       ShowChild;
     end;
     FreeLibrary(LibHandle);
    end;
    //******************************************************************************
    end.

    library dll;
    uses
     ShareMem,
     Windows,
     Messages,
     SysUtils,
     Variants,
     Classes,
     Controls,
     Forms,
     Dialogs,
     UfrmChild in 'UfrmChild.pas' {frmChild};

    {$R *.res}
    //******************************************************************************
    function ShowChild:Longint;StdCall;
    var frmChild:TfrmChild;
    begin
     try
       Application.CreateForm(TfrmChild,frmChild);
     except
      on E:Exception do ShowMessage(E.ClassName + ' ' + E.Message);
     end;
     Result := 1;
    end;
    //******************************************************************************
    exports
     ShowChild;
    //******************************************************************************
    begin
    end.

    Сейчас форма реально появилась на экране - но приложение подвисло!
  • IntruderLab (13.03.08 17:28) [64]
    на главной форме при запуске дочки caption исчезает
  • Сергей М. © (13.03.08 19:03) [65]

    > IntruderLab   (13.03.08 17:24) [63]


    > library dll;
    > uses
    >  ShareMem,


    Ты вообще-то русский ?)
  • intruderlab (13.03.08 19:52) [66]
    ты знаешь нет, я башкир :). Убираю
  • Сергей М. © (13.03.08 19:56) [67]
    Я тоже "русскостью", увы, "похвастать" не вправе)

    Но .. надо же быть внимательным, когда это в твоих интересах)
  • intruderlab (13.03.08 22:35) [68]
    извини,просто запарил,сейчас убиру и попробую запустить.
  • IntruderLab (19.03.08 15:59) [69]
    Вобщем то для тех кому интересно - решилось простым не прописыванием
    FreeLibrary(LibHandle);
  • Сергей М. © (19.03.08 17:24) [70]

    > решилось простым не прописыванием
    > FreeLibrary


    Тогда библиотека останется в памяти процесса до конца работы приложения, даже если форма, реализованная в ней, будет уничтожена и никогда более не создана вплоть до окончания работы приложения.

    Тебе оно надо ?

    Если надо, то дело хозяйское)
  • IntruderLab (21.03.08 10:33) [71]
    Я завершаю работу формы из самой дочерней формы, и вроде как она уничтожается
  • Сергей М. © (21.03.08 10:38) [72]

    > завершаю работу формы из самой дочерней формы


    Причем здесь форма ?

    Я тебе про саму dll говорю - ты убрал LoadLibrary, значит ты не выгружаешь dll из памяти процесса.


    > вроде как она уничтожается


    Это она тебе сама сказала ?)
  • Сергей М. © (21.03.08 10:57) [73]
    И вот еще что : везде
    stdcall

    понатыкано - это "щоб було" или как ?)
  • Loginov Dmitry © (21.03.08 23:04) [74]
    > Вобщем то для тех кому интересно - решилось простым не прописыванием
    >
    > FreeLibrary(LibHandle);


    Логично. Ты создавал в библиотеке дочернюю форму и тут же выгружал эту библиотеку а вместе с нею и код всех обработчиков, которые наверняка присутствовали у дочерней формы. А представляешь, каково это - обработчики без кода! :)
  • IntruderLab (31.03.08 11:20) [75]
    Представляю :) Спасибо всем!!!
 
Конференция "Основная" » DLL немодальный вызов, MDI [D7, Win2k, WinXP]
Есть новые Нет новых   [134484   +49][b:0][p:0.001]