Delirium,
когда в МультиБут понадобилось определить кто запускал консоль/GUI процесс, нашёл эту тему Как узнать имя процесса-родителя, а там ссылку в посте под номер 4
Тем не менее, код, переписанный с Делфи на С, не добавил, так как представил, что помимо explorer.exe и cmd.exe, программу может запускать totalcmd.exe, far.exe и т.д., что делает данный подход не надёжным.
Код:

#define PSAPI_VERSION 1
#include <windows.h>
#include <stdio.h>
#include <Winternl.h>
#include <Psapi.h>
#pragma comment(lib, "Psapi.lib")
int WINAPI wWinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPWSTR lpszArgs, int nWinMode)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
if(hProcess == INVALID_HANDLE_VALUE)
return -1;
HMODULE hNtDll = LoadLibrary(L"ntdll.dll");
if(hNtDll == NULL)
return -1;
typedef NTSTATUS (NTAPI *pfnNtQueryInformationProcess)(
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
pfnNtQueryInformationProcess gNtQueryInformationProcess = (pfnNtQueryInformationProcess)GetProcAddress(hNtDll, "NtQueryInformationProcess");
if(gNtQueryInformationProcess == NULL)
{
FreeLibrary(hNtDll);
return -1;
}
typedef struct _PROCESS_BASIC_INFORMATION {
NTSTATUS ExitStatus;
PPEB PebBaseAddress;
ULONG_PTR AffinityMask;
LONG BasePriority;
ULONG_PTR UniqueProcessId;
ULONG_PTR InheritedFromUniqueProcessId;
};
_PROCESS_BASIC_INFORMATION Info ={0};
gNtQueryInformationProcess(hProcess, ProcessBasicInformation, &Info, sizeof(Info), NULL);// == NO_ERROR)
CloseHandle(hProcess);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, (DWORD)Info.InheritedFromUniqueProcessId);
wchar_t szFileName[MAX_PATH] = L"";
GetModuleFileNameEx(hProcess, NULL, szFileName, MAX_PATH);
CloseHandle(hProcess);
MessageBox(NULL, szFileName, L"Hi", MB_ICONINFORMATION);
if(hNtDll != NULL)
FreeLibrary(hNtDll);
return 0;
}
На C# наверное можно перенести, а там и в Excel.
Не писал под .NET в Excel, так что не знаю нюансов, но разве при запуске второго экземпляра Excel не создаёт новой вкладке в своём окне? Или с рапортами выделяется отдельный поток и всё?