![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |