|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#31
|
||||
|
||||
непонятно почему без dll не обойтись...
Пишу программы за еду. __________________ |
#32
|
|||
|
|||
я вас не понимаю
|
#33
|
|||
|
|||
в общем мне наверное надо создать форму в dll в отдельном потоке, от основного приложения, которое использует длл и работать с ней.
вот что я нешел в интернете для этого Код:
..... private ToolTipThread: PThread; ..... procedure FormShow; begin if Assigned(ToolTipThread) then ToolTipThread.Terminate; ToolTipThread := NewThreadAutofree(Myfunc); ToolTipThread.PriorityClass := THREAD_PRIORITY_IDLE; ToolTipThread.Threadpriority := THREAD_PRIORITY_LOWEST; end; function Myfunc(Sender: pThread): integer; begin //запускаем форму //проверяем кнопки и т.д. end; из основной программы вызываем FormShow; правильный ли это код для создания потока и запуска в нем функции создания формы ? как мне вернуть значение допустим Edit1.Text с формы dll в свою основную программу? Последний раз редактировалось Admin, 23.01.2013 в 13:25. |
#34
|
|||
|
|||
кажется тут нашел пример для создания потоков, буду мучить
http://www.realcoding.net/article/view/158 |
#35
|
|||
|
|||
не создается форма в потоке, может я чтото не так делаю или так вобще нельзя делать? читал что форму в потоке можно только средствами winapi сделать , но для меня это пока что туман.
вот кусок кода моей длл с созданием формы, в обычном режиме форма создается нормально, а пытаюсь засунуть в поток - и форма не появляется. из основного приложения по кнопке вызывается функция Start(она экспортирована) Код:
unit DLL; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls,ShareMem; type TMyThread = class(TThread) private { Private declarations } protected procedure FormShow; procedure FreeForm; procedure Execute; override; end; TForm1 = class(TForm) ButtonB: TButton; ButtonS: TButton; ComboBox1: TComboBox; ButtonCS: TButton; ButtonCB: TButton; RadioGroup1: TRadioGroup; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure RadioGroup1Click(Sender: TObject); procedure ButtonCBClick(Sender: TObject); procedure ButtonBClick(Sender: TObject); procedure ButtonSClick(Sender: TObject); procedure ButtonCSClick(Sender: TObject); private { Private declarations } CallForm: THandle; public { Public declarations } end; procedure Start; var Form1: TForm1; T1: TMyThread; implementation procedure TMyThread.Execute; begin // while not Terminated do Synchronize(FormShow); end; procedure Start; begin T1:=TMyThread.Create(false); //TMyThread.FormShow; end; procedure TMyThread.FormShow; begin // with TForm1.Create(Application) do ShowModal; Form1:=TForm1.Create(nil); Form1.ShowModal; end; Последний раз редактировалось harbor, 22.01.2013 в 06:26. |
#36
|
||||
|
||||
делай все в одном приложении!
Пишу программы за еду. __________________ |
#37
|
|||
|
|||
Цитата:
я не знаю как сделать отдельное приложение, чтобы потом его связать с другой программой. то есть мое приложение должно через dll управлять другой программой со своим встроенным API. я могу в другой программе создать функцию чтения файла, и читать с него параметры, которые буду записывать своей программой. но тут проблема доступа к файлу возникнет. а как по другому сделать, кроме как dll я не знаю.. |
#38
|
|||
|
|||
хмм.. я убрал Synchronize(FormShow);
и поставил просто FormShow; форма создалась и нормально заработала но если я закрываю основное приложение то и форма закрывается тоже а ведь должна остаться ведь? хотя это не важно форма уже работает в отдельном потоке мне осталось решить задачу передачи параметров из формы в приложение, которое в своем цикле обработки уже потерло свои воспоминания о созданной форме, то есть оно теперь не видит глобальных переменных в dll Последний раз редактировалось harbor, 22.01.2013 в 18:18. |
#39
|
|||
|
|||
Ктонибудь знает как сделать разделяемую Shared переменную в DLL
как ее описывать? я скоро начну закипать |
#40
|
||||
|
||||
почитай про file mapping. CreateFileMapping / MapViewOfFile
Пишу программы за еду. __________________ |
#41
|
|||
|
|||
смотрю уже пример, ага, попробую через fmm
|
#42
|
|||
|
|||
а через file mapping можно только текст гонять?
а как бы мне передать три переменные две int и одна double конвертить их в текст не охота.. то есть есть функция записи. в данном случае из Memo Код:
function TForm1.AddText: Boolean; begin SendData := MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0); Result := SendData <> nil; StrPCopy(SendData, memSender.Text); end; а как записать три переменные int ? в гугле все совсем скудно, ничего не могу найти... Последний раз редактировалось harbor, 22.01.2013 в 22:42. |
#43
|
||||
|
||||
создай record с нужными полями...
Код:
type PGlobalData = ^TGlobalData; TGlobalData = record hWnd: HWND; uMsg: Cardinal; hDV2ControlHost: THandle; hShellTrayWnd: THandle; hButton: THandle; end; FileMappingHandle:=CreateFileMapping($ffffffff, nil, PAGE_READWRITE, 0, SizeOf(TGlobalData), FileMappingName); GlobalData:=MapViewOfFile(FileMappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalData)); GlobalData^.hWnd:=hWnd; GlobalData^.uMsg:=uMsg; GlobalData^.hDV2ControlHost:=hDV2ControlHost; GlobalData^.hShellTrayWnd:=hShellTrayWnd; GlobalData^.hButton:=hButton; Пишу программы за еду. __________________ |
#44
|
|||
|
|||
Цитата:
нахрена тогда еще одна внешняя прога, все в длл и делается где ты видел плагины чтобы еще какуюто внешнюю хрень приходилось запускать? что за другая программа (кстати с этого и надо было начинать) ? |
#45
|
|||
|
|||
вот код, работает
Код:
//////////////////////////////////////////////////////////////////////////////// // // Демо работы с Файлами отображенными в память процесса // Автор: Александр (Rouse_) Багель // © Fangorn Wizards Lab 1998 - 2003 // 23 мая 2003 17:06 // Закоментированные строки содержат пример передачи структуры unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const MMFID = '{D9CFD3BD-3E91-4748-B9F9-7A1825847DF7}'; type PTestStructure = ^TTestStructure; TTestStructure = packed record A: Integer; B: double; end; TForm1 = class(TForm) btnCreate: TButton; btnAdd: TButton; btnClose: TButton; btnOpen: TButton; btnRead: TButton; btnCloseOpen: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; procedure btnAddClick(Sender: TObject); private TextAdded, // Два флага для IsOpenFile: Boolean; // для управления состоянием кнопок SendMMF, RecMMF: THandle; SendData, RecData: PChar; procedure ButtonState(const btnState: Integer); function OpenSendMMF: Boolean; function AddText: Boolean; function CloseSend: Boolean; function OpenRecMMF: Boolean; function ReadText: Boolean; function CloseRec: Boolean; end; var Form1: TForm1; implementation {$R *.dfm} // Управляем состоянием кнопок // Кнопки становятся доступными в тот момент, когда текущая операция, // содержащаяся в обработчике кнопки, возможна ... // ============================================================================= procedure TForm1.ButtonState(const btnState: Integer); begin case btnState of 0: begin btnAdd.Enabled := True; btnClose.Enabled := True; btnOpen.Enabled := True; end; 1: begin TextAdded := True; btnRead.Enabled := IsOpenFile; end; 2: begin TextAdded := False; btnAdd.Enabled := False; btnClose.Enabled := False; btnOpen.Enabled := False; btnRead.Enabled := False; btnCloseOpen.Enabled := False; end; 3: begin IsOpenFile := True; btnCloseOpen.Enabled := True; btnRead.Enabled := TextAdded; end; 5: begin IsOpenFile := False; btnRead.Enabled := False; btnCloseOpen.Enabled := False; end; end; end; // Общий обработчик для всех кнопок ... // ============================================================================= procedure TForm1.btnAddClick(Sender: TObject); var State: Boolean; begin State := False; case TComponent(Sender).Tag of 0: State := OpenSendMMF; 1: State := AddText; 2: State := CloseSend; 3: State := OpenRecMMF; 4: State := ReadText; 5: State := CloseRec; end; if State then ButtonState(TComponent(Sender).Tag); end; // Создаем Memory Mapped File ... // ============================================================================= function TForm1.OpenSendMMF: Boolean; begin SendMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4096, PChar(MMFID)); Result := SendMMF <> 0; end; // Добавляем в файл текст ... // (передача структуры находится в закоментированных строках кода) // ============================================================================= function TForm1.AddText: Boolean; var F: TTestStructure; Z: PTestStructure; begin // SendData := MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0); // Result := SendData <> nil; // StrPCopy(SendData, memSender.Text); F.A := StrToInt(Edit1.Text); F.B := StrToFloat(Edit2.Text); Z := MapViewOfFile(SendMMF, FILE_MAP_WRITE, 0, 0, 0); Result := Z <> nil; Z^ := F; end; // Разрушаем Memory Mapped File ... // ============================================================================= function TForm1.CloseSend: Boolean; begin if btnCloseOpen.Enabled then CloseRec; UnmapViewOfFile(SendData); SendData := nil; CloseHandle(SendMMF); Result := True; end; // Открываем созданный ранее Memory Mapped File ... // ============================================================================= function TForm1.OpenRecMMF: Boolean; begin RecMMF := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(MMFID)); Result := RecMMF <> 0; end; // Читаем из него данные ... // (прием структуры находится в закоментированных строках кода) // ============================================================================= function TForm1.ReadText: Boolean; var F: TTestStructure; Z: PTestStructure; begin // RecData := MapViewOfFile(RecMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0); // Result := RecData <> nil; // memReceive.Text := RecData; Z := MapViewOfFile(SendMMF, FILE_MAP_ALL_ACCESS, 0, 0, 0); F := Z^; Result := Z <> nil; Edit3.Text := Inttostr(F.A); Edit4.Text := Floattostr(F.B); end; // Закрываем (не разрушаем) Memory Mapped File ... // ============================================================================= function TForm1.CloseRec: Boolean; begin UnmapViewOfFile(RecData); RecData := nil; CloseHandle(RecMMF); Result := True; end; end. Последний раз редактировалось harbor, 23.01.2013 в 16:01. |