Я хочу, чтобы он закрывался, когда он открывает исполняемый файл отдельно

#c# #c

Вопрос:

У меня есть два exe-файла, закодированных на C# и C . Что я хочу сделать, так это загрузить и запустить exe-файл, закодированный с помощью C , с C#. Когда приложение C не извлекается из приложения C#, я не хочу, чтобы оно запускалось непосредственно из загруженной папки. Как я могу это сделать?

Комментарии:

1. вы можете сделать это с помощью хэша md5/sha. Ваш c# хранит хэш файла, который вы скачаете, и сравнивает его с хэшем загруженного вами файла destiny. Если хэши совпадают, то нет причин (в соответствии с вашей логикой) НЕ выполнять exe-файл c

Ответ №1:

Приложение C# может передавать параметр командной строки при запуске приложения C . Если приложение C не видит этого параметра, оно может просто немедленно завершить работу, ничего больше не делая.

 Process.Start(@"c:path tocpp.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#. См.раздел Создание моментального снимка и просмотр процессов. Если оба процесса не найдены или если идентификатор процесса приложения C# не совпадает с идентификатором его собственного процесса 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, amp;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, amp;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;
}
 

Комментарии:

1. К сожалению, у меня нет никакой информации о том, что вы сказали. У вас есть возможность написать пример кода?

2. Что именно вам непонятно? Вы никогда раньше не работали с параметрами командной строки? Или вызывал какие-либо функции Win32 API раньше?

3. да, я никогда не звонил, я не знаю, к сожалению, я новичок 🙁

4. есть ли образец видео? Или я могу поискать что в googlede