Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

запуск программы 1 раз


sss1 ©   (2006-10-14 17:50:00) 

здрасти....помогите пожалуйста а как сделать что б юзре мог запустить программу 1 раз?
заранее благодарен


!!!!!!!!!!!!!!!!!!!   (2006-10-16 11:17:00) [1]

procedure TForm1.FormCreate(Sender: TObject);
begin
 if GlobalFindAtom('THIS_IS_SOME_OBSCUREE_TEXT') = 0 then
   GlobalAddAtom('THIS_IS_SOME_OBSCUREE_TEXT')
 else
 begin
   ShowMessage('Это приложение может быть запущено только один раз за сессию Windows.' + #10+#13 +
   'Если будет сделана ещё одна попытка запуска, нам придётся отформатировать винчестер');
   Halt;
 end;


Anatoly Podgoretsky   (2006-10-15 01:04:00) [2]


> А не проще просто закрыть некоторые функции программы???
>
> пользователь тыкнет, а там сообщение иди ..... купи у меня
> полную версию.

А кто же в демо включает рабочие функции, это же не триал?


HITMAN   (2006-10-15 00:55:00) [3]

А не проще просто закрыть некоторые функции программы???
пользователь тыкнет, а там сообщение иди ..... купи у меня полную версию.

Алгоритм, применяемый мною:

В блоке begin..end модуля .dpr:

begin
 if HPrevInst <>0 then
 begin
   ActivatePreviousInstance;
   Halt;
 end;
end;



Реализация в модуле:

unit PrevInst;

interface

uses
 WinProcs,
 WinTypes,
 SysUtils;

type
 PHWnd = ^HWnd;

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;

procedure ActivatePreviousInstance;

implementation

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;
var
 ClassName: array[0..30] of char;
begin
 Result := true;
 if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst then
 begin
   GetClassName(Wnd, ClassName, 30);
   if STRIComp(ClassName, 'TApplication') = 0 then
   begin
     TargetWindow^ := Wnd;
     Result := false;
   end;
 end;
end;

procedure ActivatePreviousInstance;
var
 PrevInstWnd: HWnd;
begin
 PrevInstWnd := 0;
 EnumWindows(@EnumApps, LongInt(@PrevInstWnd));
 if PrevInstWnd <> 0 then
   if IsIconic(PrevInstWnd) then
     ShowWindow(PrevInstWnd, SW_Restore)
   else
     BringWindowToTop(PrevInstWnd);
end;

end.

и вот ещё

var
 MutexHandle: THandle;
var
 UniqueKey: string;

function IsNextInstance: BOOLEAN;
begin

 Result := FALSE;

 MutexHandle := 0;
 MutexHandle := CREATEMUTEX(nil, TRUE, UniqueKey);
 if MutexHandle <> 0 then
 begin
   if GetLastError = ERROR_ALREADY_EXISTS then
   begin
     Result := TRUE;
     CLOSEHANDLE(MutexHandle);
     MutexHandle := 0;
   end;
 end;
end;

begin

 CmdShow := SW_HIDE;
 MessageId := RegisterWindowMessage(zAppName);
 Application.Initialize;
 if IsNextInstance then
   PostMessage(HWND_BROADCAST, MessageId, 0, 0)
 else
 begin
   Application.ShowMainForm := FALSE;
   Application.CreateForm(TMainForm, MainForm);
   MainForm.StartTimer.Enabled := TRUE;
   Application.Run;
 end;
 if MutexHandle <> 0 then
   CLOSEHANDLE(MutexHandle);
end.



В MainForm вам необходимо вставить обработчик внутреннего сообщения

procedure TMainForm.OnAppMessage(var M: TMSG; var Ret: BOOLEAN);
begin
 if M.Message = MessageId then
 begin
   Ret := TRUE;
   // Поместить окно наверх !!!!!!!!
 end;
end;

initialization
 ShowWindow(Application.Handle, SW_Hide);
end.


DrPass   (2006-10-14 20:30:00) [4]

Можно сделать так, чтобы это демо стирало папку "Мои документы" и писало неприличные слова на обоях десктопа. Тогда у пользователя точно отпадет желание запускать его во второй раз


Anatoly Podgoretsky   (2006-10-14 19:12:00) [5]

Никакой проблемы нет, демо есть демо.
Делать одноразовое демо, самому себе вредить, притом много кратно.


sss1   (2006-10-14 19:02:00) [6]

просто хочу предоставить программу...продемонстрировать....а если кому нить понравиться что б уже полную версию им давать...в обмен на что то)
так значь никто не сталкивался с такой проблемой?(


Anatoly Podgoretsky   (2006-10-14 18:58:00) [7]

А если он сам пользователь, то представляешь, что надо делать :)))
Не дрогнет ли рука?


Длинный логин не получился:(   (2006-10-14 18:52:00) [8]

>Anatoly Podgoretsky ©   (14.10.06 18:48) [7]

Дык и я об том же :)


Anatoly Podgoretsky   (2006-10-14 18:48:00) [9]

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


sss1   (2006-10-14 18:42:00) [10]

неее спс(((что  б прога ни разу не запускалась((


> Loginov Dmitry ©   (14.10.06 18:19) [3]
> При закрытии программы записывай куда-нибудь информацию
> о факте запуска. При повторных запусках проверяй ее наличие
> и закрывай прогу.

Юзер скачает прогу и запустит...и может так делать....продолжать это не выход...


Длинный логин не получился:(   (2006-10-14 18:39:00) [11]

По поводу запустить прогу 1 раз, идей, к сожалению, нет. А если вопрос в том, как ни разу не запустить программму, имеются наработки могу выслать на tro45@mail.ru
Подтвердите, если такая неоходимость есть


Anatoly Podgoretsky   (2006-10-14 18:23:00) [12]


> sss1 ©   (14.10.06 17:58) [2]
> даа..что б человек запустил 1 раз..и все больше не мог..
> .ну типа демо версия))

Очень жестоко. Так это демо версией и останется, если не хуже - если ее не отнесут к троянам.


Loginov Dmitry   (2006-10-14 18:19:00) [13]

При закрытии программы записывай куда-нибудь информацию о факте запуска. При повторных запусках проверяй ее наличие и закрывай прогу.


sss1   (2006-10-14 17:58:00) [14]

даа..что б человек запустил 1 раз..и все больше не мог...ну типа демо версия))


Palladin   (2006-10-14 17:51:00) [15]

вообще 1 раз?


Наверх

Титульная страница Поиск, карта сайта Написать письмо