我调用GetModuleFileName
函数,以便检索指定模块的完全限定路径,以便通过Process::Start
方法调用同一文件中的另一个.exe。
但是,当路径包含非拉丁字符(在我的情况下是希腊字符)时,无法调用.exe。
有什么方法可以解决这个问题吗?
代码:
TCHAR path[1000];
GetModuleFileName(NULL, path, 1000) ; // Retrieves the fully qualified path for the file that
// contains the specified module.
PathRemoveFileSpec(path); // Removes the trailing file name and backslash from a path (TCHAR).
CHAR mypath[1000];
// Convert TCHAR to CHAR.
wcstombs(mypath, path, wcslen(path) + 1);
// Formatting the string: constructing a string by substituting computed values at various
// places in a constant string.
CHAR mypath2[1000];
sprintf_s(mypath2, "%s\\Client_JoypadCodesApplication.exe", mypath);
String^ result;
result = marshal_as<String^>(mypath2);
Process::Start(result);
答案 0 :(得分:0)
您必须使用GetModuleFileNameW
并将结果存储在wchar_t
字符串中。
大多数Win32 API函数都有一个“Unicode”变体,它接受/给出UTF-16字符串。不鼓励使用ANSI版本。
答案 1 :(得分:0)
.NET中的字符串以UTF-16编码。您正在调用wcstombs()
这一事实意味着您的应用程序是针对Unicode编译的,TCHAR
映射到WCHAR
,这是Windows用于UTF-16的内容。所以根本不需要拨打wcstombs()
。将路径检索并格式化为UTF-16,然后将其封送为UTF-16。完全停止使用TCHAR
(除非您需要为Windows 9x / ME编译):
WCHAR path[1000];
GetModuleFileNameW(NULL, path, 1000);
PathRemoveFileSpecW(path);
WCHAR mypath[1000];
swprintf_s(mypath, 1000, L"%s\\Client_JoypadCodesApplication.exe", path);
String^ result;
result = marshal_as<String^>(mypath);
Process::Start(result);
更好的选择是使用原生.NET解决方案(未经测试):
String^ path = Path::DirectoryName(Application->StartupPath); // uses GetModuleFileName() internally
// or:
//String^ path = Path::DirectoryName(Process::GetCurrentProcess()->MainModule->FileName);
Process::Start(path + L"\\Client_JoypadCodesApplication.exe");