读书人

想在自己的BCB程序中调用一个外部程序

发布时间: 2013-12-10 15:05:55 作者: rapoo

想在自己的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");
}

读书人网 >C++ Builder

热点推荐