-
Тебе что, сложно выложить тестовый проект здесь ?
Там всего-то два-три десятка строчек)
-
не проблема :) выкладываю 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. //******************************************************************************
-
Это, ты считаешь, тестовый проект, да ?)
И я во всем этом хламе должен разбираться ?)
Убирай нафих из всех форм все ! И никаких лишних юнитов в проектах не должно быть, только действительно необходимые для теста ! Формы должны быть девственно чистыми !
ShareMem убрать к лешему везде ! Мало того , что не знаешь зачем оно надо, да еще и влупил его в хост-проекте совсем не туда, куда требует документация.
-
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.
Сейчас форма реально появилась на экране - но приложение подвисло!
-
на главной форме при запуске дочки caption исчезает
-
> IntruderLab (13.03.08 17:24) [63]
> library dll; > uses > ShareMem,
Ты вообще-то русский ?)
-
ты знаешь нет, я башкир :). Убираю
-
Я тоже "русскостью", увы, "похвастать" не вправе)
Но .. надо же быть внимательным, когда это в твоих интересах)
-
извини,просто запарил,сейчас убиру и попробую запустить.
-
Вобщем то для тех кому интересно - решилось простым не прописыванием FreeLibrary(LibHandle);
-
> решилось простым не прописыванием > FreeLibrary
Тогда библиотека останется в памяти процесса до конца работы приложения, даже если форма, реализованная в ней, будет уничтожена и никогда более не создана вплоть до окончания работы приложения.
Тебе оно надо ?
Если надо, то дело хозяйское)
-
Я завершаю работу формы из самой дочерней формы, и вроде как она уничтожается
-
> завершаю работу формы из самой дочерней формы
Причем здесь форма ?
Я тебе про саму dll говорю - ты убрал LoadLibrary, значит ты не выгружаешь dll из памяти процесса.
> вроде как она уничтожается
Это она тебе сама сказала ?)
-
И вот еще что : везде stdcall понатыкано - это "щоб було" или как ?)
-
> Вобщем то для тех кому интересно - решилось простым не прописыванием > > FreeLibrary(LibHandle);
Логично. Ты создавал в библиотеке дочернюю форму и тут же выгружал эту библиотеку а вместе с нею и код всех обработчиков, которые наверняка присутствовали у дочерней формы. А представляешь, каково это - обработчики без кода! :)
-
Представляю :) Спасибо всем!!!
|