首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

想在自己的BCB程序中调用一个外部程序,让它能够驻留到内存里一直运行,如何做

2013-12-10 
想在自己的BCB程序中调用一个外部程序,让它能够驻留到内存里一直运行,怎么做?如题,假设外部程序名为test.e

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

热点排行