我希望它在单独打开 exe 文件时关闭

Posted

技术标签:

【中文标题】我希望它在单独打开 exe 文件时关闭【英文标题】:I want it to close when it opens the exe file separately 【发布时间】:2021-04-14 22:24:51 【问题描述】:

我有两个用 C# 和 C++ 编码的 exe 文件。我想要做的是从 C# 下载并运行用 C++ 编码的 exe。当 C++ 应用程序不是从 C# 应用程序中获取时,我不希望它直接从下载的文件夹中启动。我该怎么做?

【问题讨论】:

你可以通过 md5/sha hash 来做到这一点。您的 c# 存储您将下载的文件的哈希值,并将其与您已下载的命运文件的哈希值进行比较。如果哈希匹配,则没有理由(根据您的逻辑)不执行 c++ exe 文件 【参考方案1】:

C# 应用程序可以在启动 C++ 应用程序时传递命令行参数。如果 C++ 应用程序没有看到该参数,它可以立即终止自身而无需执行任何其他操作。

Process.Start(@"c:\path to\cpp.exe", "-startedByCSharpApp");
#include <string.h>

bool startedByCSharpApp(int argc, char* argv[])

    for(int i = 1; i < argc; ++i) 
        if (strcmp(argv[i], "-startedByCSharpApp") == 0) 
            return true;
        
    
    return false;


int main(int argc, char* argv[])

    if (startedByCSharpApp(argc, argv))
    
        // normal operations here ...
    
    return 0;

另一种选择是让 C++ 应用程序调用 CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS)Process32First()/Process32Next() 来遍历正在运行的进程列表以查找自身和 C# 应用程序。见Taking a Snapshot and Viewing Processes。如果两者都没有找到,或者如果 C# 应用的进程 ID 与它自己的进程的 th32ParentProcessID 不匹配,它可以立即终止自身。

#include <tlhelp32.h>
#include <tchar.h>

#include <vector>
#include <algorithm>

bool startedByCSharpApp()

    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
        return false;

    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(pe32);

    if (!Process32First(hProcessSnap, &pe32))
    
        CloseHandle(hProcessSnap);
        return false;
    

    DWORD MyProcessId = GetCurrentProcessId();
    DWORD MyParentProcessId = 0;
    std::vector<DWORD> CSharpAppPIDs;

    do
    
        if (pe32.th32ProcessID == MyProcessId)
        
            MyParentProcessId = pe32.th32ParentProcessID;
        
        else if (_tcscmp(pe32.szExeFile, "csharp.exe") == 0)
        
            CSharpAppPIDs.push_back(pe32.th32ProcessID);
        
    
    while (Process32Next(hProcessSnap, &pe32));

    CloseHandle(hProcessSnap);

    if (MyParentProcessId != 0)
        return (std::find(CSharpAppPIDs.begin(), CSharpAppPIDs.end(), MyParentProcessId) != CSharpAppPIDs.end());

    return false;


int main()

    if (startedByCSharpApp())
    
        // normal operations here ...
    
    return 0;

【讨论】:

很遗憾,我不知道您所说的内容。你有机会写一个示例代码吗? 您有什么不清楚的地方?您以前从未使用过命令行参数吗?或者之前调用过任何 Win32 API 函数? 是的,我从来没有打电话我不知道不幸的是我是新人:( 有示例视频吗?或者我可以在 googlede 上搜索什么 你好,现在我需要相反的我想用 c++ 启动 c# 应用程序我的 c# 应用程序不会运行,除非它在 ​​c++ 应用程序中启动

以上是关于我希望它在单独打开 exe 文件时关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 API 窗口反汇编 exe 文件? [关闭]

在基于文档的应用程序中打开无标题文件

cx_Freeze Exe 应用程序一打开就关闭

pip.exe 和其他程序在启动时关闭

使用Python不断打开exe文件和关闭exe文件

使用Python不断打开exe文件和关闭exe文件