GetModuleFileName返回值52428

Pokeeeer 2015-07-29 02:24:42
想通过GetModuleFileName获取dll所在路径,返回值错误
TCHAR CMiLang::getPath()
{
TCHAR dllPath[MAX_PATH] = {0};
GetModuleFileName(NULL, dllPath, MAX_PATH);
return dllPath[MAX_PATH];
}


main函数下单步调试,返回值是52428+一个韩文...


求大神帮分析下问题在哪。。。
...全文
247 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
二班的码农 2015-07-30
  • 打赏
  • 举报
回复
TCHAR转化成string std::string TCHAR2STRING(TCHAR *STR) { int iLen = WideCharToMultiByte(CP_ACP, 0,STR, -1, NULL, 0, NULL, NULL); char* chRtn =new char[iLen*sizeof(char)]; WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL); std::string str(chRtn); return str; }
Pokeeeer 2015-07-30
  • 打赏
  • 举报
回复
引用 3 楼 SXJIAKE 的回复:
问题很多的: 1. 返回一个临时变量,而不是类成员或全局变量? 2. 返回字符串(字符地址),为什么返回的是字符? 3. 返回是一个字符也就罢了,还是个越界的字符!
class CMiLang {
private:
    TCHAR dllPath[MAX_PATH];
public:
    LPCTSTR getPath(void);
}

LPCTSTR CMiLang::getPath(void)
{
    DWORD dwCount = GetModuleFileName(NULL, dllPath, MAX_PATH);
    return ((dwCount > 0) && (dwCount < MAX_PATH)) ? dllPath : TEXT("");
}
很感谢你的指正,的确是越界了,可是size已经设置成MAX_PATH(应该是260)了,这个应该怎么处理呢? 实际上,我要得到这个路径是要对路径进行修改,比如:获取到“c:\\a.exe” 我想将a.exe replace其他文件名,在对“a.exe”进行搜索时rfind只能处理string类型的,这个应该怎么办呢?TEXT可以吧TCHAR转化成字符串吗? 还请帮吗解答!
「已注销」 2015-07-30
  • 打赏
  • 举报
回复
问题很多的: 1. 返回一个临时变量,而不是类成员或全局变量? 2. 返回字符串(字符地址),为什么返回的是字符? 3. 返回是一个字符也就罢了,还是个越界的字符!
class CMiLang {
private:
    TCHAR dllPath[MAX_PATH];
public:
    LPCTSTR getPath(void);
}

LPCTSTR CMiLang::getPath(void)
{
    DWORD dwCount = GetModuleFileName(NULL, dllPath, MAX_PATH);
    return ((dwCount > 0) && (dwCount < MAX_PATH)) ? dllPath : TEXT("");
}
Pokeeeer 2015-07-29
  • 打赏
  • 举报
回复
引用 楼主 UAVGCS 的回复:
想通过GetModuleFileName获取dll所在路径,返回值错误
TCHAR CMiLang::getPath()
{
	TCHAR dllPath[MAX_PATH] = {0};
	GetModuleFileName(NULL, dllPath, MAX_PATH);
	return dllPath[MAX_PATH];
}
main函数下单步调试,返回值是52428+一个韩文... 求大神帮分析下问题在哪。。。
dllPath[MAX_PATH]应该是一个内存地址,怎么把里面的东西拷出来打印呢?
赵4老师 2015-07-29
  • 打赏
  • 举报
回复
GetModuleFileName The GetModuleFileName function retrieves the full path and filename for the executable file containing the specified module. Windows 95: The GetModuleFilename function will return long filenames when an application's version number is greater than or equal to 4.00 and the long filename is available. Otherwise, it returns only 8.3 format filenames. DWORD GetModuleFileName( HMODULE hModule, // handle to module to find filename for LPTSTR lpFilename, // pointer to buffer to receive module path DWORD nSize // size of buffer, in characters ); Parameters hModule Handle to the module whose executable filename is being requested. If this parameter is NULL, GetModuleFileName returns the path for the file used to create the calling process. lpFilename Pointer to a buffer that is filled in with the path and filename of the given module. nSize Specifies the length, in characters, of the lpFilename buffer. If the length of the path and filename exceeds this limit, the string is truncated. Return Values If the function succeeds, the return value is the length, in characters, of the string copied to the buffer. If the function fails, the return value is zero. To get extended error information, call GetLastError. Remarks If a module is loaded in two processes, its module filename in one process may differ in case from its module filename in the other process. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Unsupported. Header: Declared in winbase.h. Import Library: Use kernel32.lib. Unicode: Implemented as Unicode and ANSI versions on Windows NT. See Also Dynamic-Link Libraries Overview, Dynamic-Link Library Functions, GetModuleHandle, LoadLibrary
实验二 进程管理   Windows所创建的每个进程都从调用CreateProcess() API函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于C++ 运行库来说,这一调用发生在应用程序的main() 函数返回之后。 1. 创建进程 CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行。表 2-1详细地列出了每个参数的类型和名称。   表2-1 CreateProcess() 函数的参数 参数名称 使用目的 LPCTSTR lpApplivationName 全部或部分地指明包括可执行代码的EXE文件的文件名 LPCTSTR lpCommandLine 向可执行文件发送的参数 LPSECURIITY_ATTRIBUTES lpProcessAttributes 返回进程句柄的安全属性。主要指明这一句柄是否应该由其他子进程所继承 LPSECURIITY_ATTRIBUTES lpThreadAttributes 返回进程的主线程的句柄的安全属性 BOOL bInheritHandle 一种标志,告诉系统允许新进程继承创建者进程的句柄 DWORD dwCreationFlage 特殊的创建标志 (如CREATE_SUSPENDED) 的位标记 LPVOID lpEnvironment 向新进程发送的一套环境变量;如为null值则发送调用者环境 LPCTSTR lpCurrentDirectory 新进程的启动目录 STARTUPINFO lpStartupInfo STARTUPINFO结构,包括新进程的输入和输出配置的详情 LPPROCESS_INFORMATION lpProcessInformation 调用的结果块;发送新应用程序的进程和主线程的句柄和ID   可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关。 然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为。经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用ResumeThread() API来启动进程。另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口。这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间。 接着是CreateProcess() 函数调用所需要的三个通常使用缺省值的参数。第一个参数是lpEnvironment参数,指明为新进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明新应用程序的主窗口的外观。 CreateProcess() 的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲区。以PROCESS_INFORMATION结构中返回的句柄调用CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源。 2. 正在运行的进程 如果一个进程拥有至少一个执行线程,则为正在系统中运行的进程。通常,这种进程使用主线程来指示它的存在。当主线程结束时,调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当进程正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改。 首先可查看的进程特性是系统进程标识符 (PID) ,可利用GetCurrentProcessId() API函数来查看,与GetCurrentProcess() 相似,对该函数的调用不能失败,但返回的PID在整个系统中都可使用。其他的可显示当前进程信息的API函数还有GetStartupInfo()和GetProcessShutdownParameters() ,可给出进程存活期内的配置详情。 通常,一个进程需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在CreateProcess() 中的参数以启动应用程序。在创建应用程序时可使用的另一个

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧