一個簡單的問題,300分求解 (300分)

  • 主题发起人 主题发起人 stuwe
  • 开始时间 开始时间
S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
我有兩個可執行程序,第一個是真正的程序,第二個隻是設置數據庫連接用的程序,現在為了方便,要將兩個捆綁成一個可執行程序。然後在程序運行的時候檢測數據庫是否連接成功,不成功的話就運行第二個程序來設置數據庫連接,在第一個程序調用第二個程序運行之前,先檢測第二個程序是否存在,不存在就直接將第二個程序釋放出來,再運行。

現在最主要的問題是如何將兩個程序捆綁在一起和如何將另一個程序釋放出來,用Delphi5實現
 
createproccess()
waitforobject()
 
具體一點啦
我很菜的,最好是寫出代碼或發郵件給我
stuwe#163.com //#是@ 為了防止垃圾[:)]
 
杀死进程的例子
//uses TLHelp32;

//ÀàÐÍÉùÃ÷
type
PProcessInfo = ^TProcessInfo;
TProcessInfo = Record
ExeFile : String;
ProcessID : DWORD;
end;

procedure EnumProcess(const AList : TList);
//ö¾Ù½ø³Ì
var
p : pProcessInfo;
ContinueLoop : BOOL;
FSnapshotHandle : THandle;
FProcessEntry32 : TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
try
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop)<>0 do
begin
New(p);
p.ExeFile := FProcessEntry32.szExeFile;
p.ProcessID := FProcessEntry32.th32ProcessID;
AList.Add(p);
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
finally
CloseHandle(FSnapshotHandle);
end;
end;

procedure KillProcess(
const dwProcessId: DWORD
);
//ɱ½ø³Ì
var
ProcHandle: THandle;
begin
ProcHandle := OpenProcess(1, FALSE, dwProcessID);
try
if ProcHandle <> 0 then
begin
if TerminateProcess(ProcHandle, $FFFFFFFF) then
WaitForSingleObject(ProcHandle, INFINITE);
end;
finally
CloseHandle(ProcHandle);
end;
end;

procedure KillMe;
var
i : Integer;
l : TList;
begin
l := TList.Create;
try
EnumProcess(l);
for i := 0 to l.Count - 1 do
if UpperCase(pProcessInfo(l).ExeFile)=UpperCase(ExtractFileName(Application.ExeName)) then
KillProcess(pProcessInfo(l).ProcessID);
finally
l.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
KillMe;
end;
 
把第二个程序内容写到第一个程序后面,再写上第二个程序的大小,运行时先读出大小,再解出文件
 
to:weiwei81123

具體的代碼或操作應該怎麼做呢?
 
可以把第二个程序附加到第一个程序尾部,释放的话,把它都出来另存为文件就行了
 
暈,每個都說得這麼輕鬆,沒有一個願意說具體一點[?][?]


原理我知道,但具體操作怎麼操作呢????
 
捆绑:
var
ms1, ms2: TMemoryStream;
Program2Size: Integer;
begin
ms1 := TMemoryStream.Create;
ms2 := TMemoryStream.Create;
try
ms1.LoadFromFile('Program1.exe');
ms2.LoadFromFile('Program2.exe');
ms1.Seek(0, soFromEnd);
ms1.CopyFrom(ms2, ms2.Size);
Program2Size := ms2.Size;
ms1.Write(Program2Size, 4);
ms1.SaveToFile('Program12.exe');
finally
ms1.Free;
ms2.Free;
end;
end;

释放:
var
fs: TFileStream;
ms: TMemoryStream;
Program2Size: Integer;
begin
fs := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
ms := TMemoryStream.Create;
try
fs.Seek(-4, soFromEnd);
fs.Read(Program2Size, 4);
fs.Seek(-4-Program2Size, soFromEnd);
ms.CopyFrom(fs, Program2Size);
ms.SaveToFile('Program2.exe');
finally
fs.Free;
ms.Free;
end;
end;
 
你为何不把两个程序和在一起呢,在注册表中设一个键值,记录数据库连接的信息,然后连接数据库,若成功,则不启动相应的数据库连接向导模块,若是连接不成功,则启动数据库连接向导模块。并在程序中设计一个数据库连接配置按钮,用于数据库连接的调整和修改。
我做成功了,你试试吧。
这样比用两个程序的效率要好,实现起来也很简单。
 
這一種方式我有用過,現在就是想改一種新的做法,再說了,技術還是要多學習點新的[:)]
 
我还是建议你封装在一个系统里面,比如说把连接的那个程序封装成动态连接库
这样方便合理,而且可以少掌握一些知识:)(I 的追求)
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=2763
上面有一篇
 
哦,这个问题啊。你可以用brcc32将第二个程序打包进第一个程中。

释放的时候,你可以直接将打包进来的文件保存出来再执行就行了。

如果你想了解具体的方法,联系我 QQ:63017954
 
封装在一个系统里面
 
我给你发了一个DEMO,你看看对你没有帮助吧
 
好的
郵箱地址stuwe#163.com #改為@
 
多人接受答案了。
 
后退
顶部