Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Завершить программу, но оставить работать DLL, как??? 
:(
    Опции темы
Etar
  Дата 29.1.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 21.2.2008

Репутация: нет
Всего: 1



Привет!

Подскажите пожалуйста,
у меня есть простенькая функция в DLL, которая ждет когда пользователь закончит работу с программой, а потом когда он это сделает,
заменяет её .exe файл на новый (т.е. что-то типа простенького обновления):

Код

library appupdate;

uses
  SysUtils, Windows;

{$R *.res}

function UpdateApp(SourceFileName, DestFileName: String): Boolean;
var
  HFileRes: HFILE;
begin
  Result := false;
  if FileExists(DestFileName) then
    while true do
    begin
      HFileRes := CreateFile(PChar(DestFileName), GENERIC_READ or
       GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      if HFileRes <> INVALID_HANDLE_VALUE then
      begin
        CloseHandle(HFileRes);
        Break;
      end;
    end;
  if CopyFile(PChar(SourceFileName), PChar(DestFileName), false) then
  begin
    WinExec(PAnsiChar(DestFileName), SW_SHOW);
    Result := true;
  end;
end;

exports
  UpdateApp;

begin
end.


В программе у меня по кнопке "Обновить программу" должно быть следующее:
1. Вызывается функция AppUpdate из dll и программа завершает работу
2. Функция AppUpdate продолжает работать: ждет когда программа закроется, затем копирует новую версию программы и запускает ее.

Сделал я это по простому:
Код

unit Unit1;

interface

uses
  Forms, Classes, Controls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

 function UpdateApp(SourceFileName, DestFileName: String): Boolean; external
  'appupdate.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  UpdateApp('C:\NewApp.exe', Application.ExeName);
  Application.Terminate;
end;

end.


Но у меня, естественно, программа просто зависла.

Я вот хотел узнать как можно сделать так, чтобы все работало как надо (т.е. например, dll работала бы параллельно, либо работа программы завершалась из самой dll).


Подскажите пожалуйста кому не сложно.

Спасибо.

PM MAIL   Вверх
Poseidon
Дата 29.1.2009, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Вместо dll сделай exe. Библиотеки освобождаются при выгрузке использовавших их программ. Т.е. получается, когда ты закрываешь свою программы, ты закрываешь этим и функцию в dll. Создай exe с одной функцией и вызывай ее при завершении основной программы.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Exciter
Дата 29.1.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



Кроме того. У тебя While никогда не прекратится.
Надо делать вот так.

Код

const
    //форма которую надо найти
    ExternalForm = 'TForm1';
    ExitMessage = WM_User + 2;

procedure TUpdaterForm.WaitForExitProgram;
var SelectorHandle: HWND;
begin
     SelectorHandle := FindWindow(ExternalForm, nil);
     If SelectorHandle <> 0 Then
      begin
       // посылаем сообщение проге, что надо выгрузиццо
       SendMessage(SelectorHandle, ExitMessage, 0, 0);
       repeat
        SelectorHandle := FindWindow(ExternalForm, nil);
       until (SelectorHandle = 0);
      end;

      // Задержка для полной выгрузки программы из пямяти
      // и освобождения доступа к физическому файлу
      Sleep(1000);
end;


В самой проге 

Код

const
    //форма которую надо найти
    ExitMessage = WM_User + 2;

  private
    { Private declarations }
    Procedure ExtraQuit(var Msg : TWMNoParams); message ExitMessage;

procedure TfmGraf.ExtraQuit(var Msg: TWMNoParams);
begin
  Application.Terminate;
  // ну или Close на твоё усмотрение
end;


Это сообщение отредактировал(а) Exciter - 29.1.2009, 15:27
PM MAIL   Вверх
Akella
Дата 29.1.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Можно зщапускать DLL с помощью виндовой Rundll32.exe
PM MAIL   Вверх
Etar
Дата 2.2.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 60
Регистрация: 21.2.2008

Репутация: нет
Всего: 1



спасибо за ответы
сейчас буду пробовать!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.