Como obter o nome do executável do aplicativo no WindowsC ++ / CLI?
Pergunta
Eu preciso alterar a funcionalidade de uma aplicação com base no nome executável. Nada grande, apenas mudando cordas que são exibidos e alguns identificadores internos. A aplicação é escrito numa mistura de C ++ Net nativa e - CLI código.
Duas maneiras que eu olhei são para analisar a função () em Win32 e encher ao redor com o AppDomain e outras coisas na Net GetCommandLine. No entanto usando GetCommandLine nem sempre funciona como quando executado a partir do depurador da linha de comando está vazio. E as coisas .Net AppDomain parece exigir um monte de recheio ao redor.
Então, o que é o melhor / mais simples / forma mais eficiente de determinar o nome do executável em C ++ / CLI? (Eu sou uma espécie de esperança que eu só perdeu algo simples que está disponível em .Net.)
Edit:. Uma coisa que devo mencionar é que este é um aplicativo do Windows GUI usando C ++ / CLI, portanto, não há acesso para a função principal estilo C tradicional, ele usa a função Windows WinMain ()
Solução
GetModuleFileName () usando 0 como uma alça de módulo.
Nota: você pode também usam o argv [0] parâmetro para principal ou ligue GetCommandLine () se não houver principal. No entanto, tenha em mente que esses métodos não necessariamente dar-lhe o caminho completo para o arquivo executável. Eles vão dar a volta a mesma cadeia de caracteres que foi usada para iniciar o programa. Chamando GetModuleFileName () irá sempre dar-lhe um caminho e nome de arquivo completo.
Outras dicas
A resposta de Ferruccio é bom. Aqui está um código de exemplo:
TCHAR exepath[MAX_PATH+1];
if(0 == GetModuleFileName(0, exepath, MAX_PATH+1))
MessageBox(_T("Error!"));
MessageBox(exepath, _T("My executable name"));
Use o argumento argv
para main
:
int main(int argc, char* argv[])
{
printf("%s\n", argv[0]); //argv[0] will contain the name of the app.
return 0;
}
Você pode precisar digitalizar a cadeia a informações de diretório de remoção e / ou extensões, mas o nome vai estar lá.
Use __argv [0]
Há um método estático na Assembléia que vai buscá-la para você em .NET.
Assembly.GetEntryAssembly().FullName
Edit: Eu não sabia que você queria o nome do arquivo ... você também pode conseguir isso chamando:
Assembly.GetEntryAssembly().CodeBase
Isso vai te dar o caminho completo para a montagem (incluindo o nome do arquivo).
Eu posso confirmar que funciona sob Win64 / visual studio 2017 / MFC
TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);
exe contém caminho completo para exe.