Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #31  
Старый 21.01.2013, 21:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

непонятно почему без dll не обойтись...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #32  
Старый 21.01.2013, 22:47
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

я вас не понимаю
Ответить с цитированием
  #33  
Старый 22.01.2013, 02:25
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

в общем мне наверное надо создать форму в 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  
Старый 22.01.2013, 03:48
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

кажется тут нашел пример для создания потоков, буду мучить

http://www.realcoding.net/article/view/158
Ответить с цитированием
  #35  
Старый 22.01.2013, 06:22
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

не создается форма в потоке, может я чтото не так делаю или так вобще нельзя делать? читал что форму в потоке можно только средствами 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  
Старый 22.01.2013, 07:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

делай все в одном приложении!
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #37  
Старый 22.01.2013, 08:03
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
делай все в одном приложении!
NumLock, я же знаю, вы гуру, что я делаю не так?)

я не знаю как сделать отдельное приложение, чтобы потом его связать с другой программой.
то есть мое приложение должно через dll управлять другой программой со своим встроенным API.
я могу в другой программе создать функцию чтения файла, и читать с него параметры, которые буду записывать своей программой. но тут проблема доступа к файлу возникнет.
а как по другому сделать, кроме как dll я не знаю..
Ответить с цитированием
  #38  
Старый 22.01.2013, 08:16
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

хмм.. я убрал Synchronize(FormShow);
и поставил просто FormShow;
форма создалась и нормально заработала
но если я закрываю основное приложение то и форма закрывается тоже
а ведь должна остаться ведь? хотя это не важно
форма уже работает в отдельном потоке

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

Последний раз редактировалось harbor, 22.01.2013 в 18:18.
Ответить с цитированием
  #39  
Старый 22.01.2013, 20:42
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

Ктонибудь знает как сделать разделяемую Shared переменную в DLL
как ее описывать?
я скоро начну закипать
Ответить с цитированием
  #40  
Старый 22.01.2013, 21:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

почитай про file mapping. CreateFileMapping / MapViewOfFile
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #41  
Старый 22.01.2013, 21:47
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

смотрю уже пример, ага, попробую через fmm
Ответить с цитированием
  #42  
Старый 22.01.2013, 22:22
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

а через 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  
Старый 23.01.2013, 08:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

создай 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  
Старый 23.01.2013, 12:05
my33oh my33oh вне форума
Новичок
 
Регистрация: 17.12.2012
Сообщения: 93
Репутация: -579
По умолчанию

Цитата:
Сообщение от harbor
то есть мое приложение должно через dll управлять другой программой со своим встроенным API.
плагин чтоле?
нахрена тогда еще одна внешняя прога, все в длл и делается
где ты видел плагины чтобы еще какуюто внешнюю хрень приходилось запускать?
что за другая программа (кстати с этого и надо было начинать) ?
Ответить с цитированием
  #45  
Старый 23.01.2013, 13:36
harbor harbor вне форума
Новичок
 
Регистрация: 15.01.2010
Сообщения: 83
Репутация: 10
По умолчанию

вот код, работает
Код:
////////////////////////////////////////////////////////////////////////////////
//
//  Демо работы с Файлами отображенными в память процесса
//  Автор: Александр (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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter