WindowsC ++/CLI에서 응용 프로그램 실행 가능 이름을 얻는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/124886

  •  02-07-2019
  •  | 
  •  

문제

실행 파일 이름을 기준으로 응용 프로그램의 기능을 변경해야합니다. 표시되는 크고 변화하는 문자열과 일부 내부 식별자는 없습니다. 응용 프로그램은 기본 및 .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의 전체 경로가 포함되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top