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 ()

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top