WindowsC ++/CLI에서 응용 프로그램 실행 가능 이름을 얻는 방법은 무엇입니까?
문제
실행 파일 이름을 기준으로 응용 프로그램의 기능을 변경해야합니다. 표시되는 크고 변화하는 문자열과 일부 내부 식별자는 없습니다. 응용 프로그램은 기본 및 .NET C ++ -CLI 코드의 혼합으로 작성됩니다.
내가 보았던 두 가지 방법은 Win32의 getCommandline () 함수를 구문 분석하고 appDomain 및 기타 .NET의 다른 것들과 함께 채우는 것입니다. 그러나 getCommandLine을 사용하는 것이 디버거에서 실행될 때 항상 작동하지는 않습니다. .NET AppDomain 물건은 주위에 많은 것을 먹는 것 같습니다.
그렇다면 C ++/CLI에서 실행 파일 이름을 결정하는 가장 좋은/가장 간단한/가장 효율적인 방법은 무엇입니까? (나는 .NET에서 제공되는 단순한 것을 놓친 것을 놓칠 수 있기를 바라고 있습니다.)
편집 : 언급해야 할 한 가지는 이것이 C ++/CLI를 사용하는 Windows GUI 응용 프로그램이므로 기존 C 스타일 기본 기능에 액세스 할 수 없으므로 Windows WinMain () 함수를 사용합니다.
해결책
부르다 getModuleFilename () 모듈 핸들로 0을 사용합니다.
참고 : 당신 ~할 수 있다 또한 메인이없는 경우 argv [0] 매개 변수를 메인 또는 GetCommandLine ()에 호출하십시오. 그러나 이러한 방법이 반드시 실행 파일에 대한 완전한 경로를 제공 할 필요는 없습니다. 그들은 프로그램을 시작하는 데 사용 된 것과 동일한 문자를 돌려 줄 것입니다. getModuleFilename () 호출은 항상 완전한 경로 및 파일 이름을 제공합니다.
다른 팁
페루치오의 대답은 좋습니다. 다음은 예제 코드입니다.
TCHAR exepath[MAX_PATH+1];
if(0 == GetModuleFileName(0, exepath, MAX_PATH+1))
MessageBox(_T("Error!"));
MessageBox(exepath, _T("My executable name"));
사용 argv
논쟁 main
:
int main(int argc, char* argv[])
{
printf("%s\n", argv[0]); //argv[0] will contain the name of the app.
return 0;
}
디렉토리 정보 및/또는 확장자를 제거하려면 문자열을 스캔해야 할 수도 있지만 이름이 있습니다.
__argv [0] 사용
어셈블리에는 .NET에서 얻을 수있는 정적 방법이 있습니다.
Assembly.GetEntryAssembly().FullName
편집 : 파일 이름을 원한다는 것을 몰랐습니다.
Assembly.GetEntryAssembly().CodeBase
이를 통해 어셈블리의 전체 경로 (파일 이름 포함)가됩니다.
Win64/ Visual Studio 2017/ MFC에서 작동하는지 확인할 수 있습니다.
TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);
exe에는 Exe의 전체 경로가 포함되어 있습니다.