想在自己的BCB程序中调用一个外部程序,让它能够驻留到内存里一直运行,怎么做?
如题,假设外部程序名为test.exe,
要求自己的BCB程序退出后,test.exe依然在内存里一直运行,在自己的BCB程序再次运行时,能够判断test.exe已经运行了,避免再次调用test.exe
[解决办法]
就是只能运行一次,是这个意思吧,百度一下,很多解决方案,代码都有的
[解决办法]
先遍历所有进程,判断指定路径的文件是否存在于进程列表中,如果不存在,则用ShellExecute来运行那个可执行文件就行了.
[解决办法]
简单代码实现(注意只能在32位Windows中使用,如果是64位的,则需要修改部分代码)
#include <tchar.h>
#include <tlhelp32.h>
BOOL __stdcall CrnRunAppOneInstance(LPCTSTR lpAppFile)
{
BOOL bResult = FALSE;
PROCESSENTRY32 pe32 = { 0 };
pe32.dwSize = sizeof(pe32);
MODULEENTRY32 me32 = { 0 };
me32.dwSize = sizeof(me32);
HANDLE hSnapProcess = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (!hSnapProcess) return bResult;
HANDLE hSnapModule;
BOOL bFound = FALSE;
BOOL bFlag = ::Process32First(hSnapProcess, &pe32);
while (bFlag)
{
hSnapModule = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);
if (!hSnapModule) continue;
::Module32First(hSnapModule, &me32);
::CloseHandle(hSnapModule);
if (!_tcscmp(lpAppFile, me32.szExePath))
{
bFound = TRUE;
break;
}
bFlag = ::Process32Next(hSnapProcess, &pe32);
}
::CloseHandle(hSnapProcess);
if (!bFound)
{
::ShellExecute(NULL, TEXT("Open"), lpAppFile, NULL, NULL, SW_SHOW);
bResult = TRUE;
}
return bResult;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CrnRunAppOneInstance("C:\\Windows\\system32\\calc.exe");
}