#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