这个问题有点意思 (10分)

  • 主题发起人 主题发起人 DelphiWW
  • 开始时间 开始时间
D

DelphiWW

Unregistered / Unconfirmed
GUEST, unregistred user!
一个程序, 其中有单元文件, 也有工程文件; 当工程文件如下, 能编译过, 却不能运行为什么? 明眼人能告诉我错在哪吗? 抢答题[:D][:D][:D]
另一种问法就是: 我这样阻止一个程序同一时间运行两个"实例"有什么问题?

program Project1;

uses
Forms,
Windows,
Dialogs,
SysUtils,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
b: Integer;
begin
Application.Initialize;
CreateMutex(nil, False, 'aaa');
b := GetLastError;
if b <> Windows.ERROR_ALREADY_EXISTS then
begin
Application.CreateForm(TForm1, Form1)
end
else
begin
Application.MessageBox('程序已运行。', 'a', 0);
Application.Terminate;
end;
Application.Run;
end.


 
mutex是什么啊,
怎么没有PRIVATE呢。
 
你是不是想判断程序是否已经运行,我这里有代码:

function PrevInstance: Boolean;
var
hMutex : DWORD;
begin
try
//创建一个互斥对象;
hMutex := CreateMutex(nil, True, PChar(Application.Title));

//已有一个实例在运行;
if GetLastError = ERROR_ALREADY_EXISTS then
Result := True
else
Result := False;

finally
ReleaseMutex(hMutex);
Closehandle(hMutex);
end;
end;

工程文件:
begin
//检查程序是否已经运行
if PrevInstance() then
Exit;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
 
沒有主窗口怎麼運行啊??

如果你非要這樣做的話,就這樣吧
begin
Application.Initialize;
Application.ShowMainForm:=false;
Application.CreateForm(TForm1, Form1);

CreateMutex(nil, False, 'aaa');
b := GetLastError;
if b <> Windows.ERROR_ALREADY_EXISTS then
begin
Application.ShowMainForm:=true;
Application.MainForm.Show;
end
else
begin
Application.MessageBox('程序已运行。', 'a', 0);
Application.Terminate;
end;
Application.Run;
end.
 
To angshuangxi:
你理解对了我的意思, [:)], 我是想问一下, 我那样写, 为什么编译过了, 却运行不
起来呢?
 
因为主窗口没有创建,
这一句少了吧?
Application.CreateForm(TForm1, Form1);
 
编译通过表示是没有语法错误。是逻辑错误,编译器并不会判断逻辑错误。
如数组下标越界,编译器是不管的但程序一运行就出错。
 
To whbell
我的程序里有这句.

To chenshaizi
请指出逻辑错误[:)]
 
没有Application.Run;怎么先弹出消息呀
 
To asiasmm:
请工程文件里试试先
 
Application.CreateForm(TForm1, Form1);
把这一句放到IF 之外, 才可以运行程序。
否则根本无法运行。

具体原因可能和编译器有关系。
关注。。。
 
Application.CreateForm(TForm1, Form1)
后面加个分号试试?
 
To whbell:
答案正确. [:)]我们也顺便看到了一个Delphi 编译器的小bug.[:D][:D][:D]

 
各位高手们, 能对上面的结论发表点意见吗?
 
unit UStopProgramRun;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TStopProgramRunFrm = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
StopProgramRunFrm: TStopProgramRunFrm;
hnd: Thandle;

implementation
{$R *.dfm}

initialization
hnd := CreateMutex(nil,True,'irgendwaseinmaliges');
if GetLastError = ERROR_ALREADY_EXISTS then Halt;
finalization
if hnd <> 0 then
CloseHandle(hnd);
ShowMessage('当前程序窗口已运行');
end.
 
学到了一点:
可省可不省的地方都不要省
可写可不写的代码都给我写上!
 
多人接受答案了。
 
我认为angshuangxi的代码很好。
看着舒服。
 
后退
顶部