【问题标题】:Visual C++ GetModuleFileName() ProblemsVisual C++ GetModuleFileName() 问题
【发布时间】:2014-01-17 19:54:16
【问题描述】:

我使用以下代码在按下按钮时打开可执行文件:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
TCHAR buffer[MAX_PATH];
GetModuleFileName(NULL,buffer,sizeof(buffer));
ShellExecuteW(NULL, L"Open", buffer, NULL, NULL, SW_SHOWNORMAL);
}

我现在正尝试通过将 NULL 替换为 PDF 文件名来打开 PDF 文件,如下所示:

GetModuleFileName(_T("testt.pdf"),buffer,sizeof(buffer));

当我编译这个时,我得到以下错误:

error C2664: 'GetModuleFileNameW' : cannot convert parameter 1 from 'const wchar_t [10]' to 'HMODULE'

一旦成功,exe 文件将与 PDF 一起保存在一个文件夹中,但此文件的目录可能会更改,由于我使用了 GetModuleFileName,此代码是否会自动更新以适应这种情况?另外,有人可以向我解释一下我将如何修复此代码吗?

谢谢。

【问题讨论】:

  • 要调用 shell 命令(Windows 资源管理器),您应该使用 Shell 函数,如 ShellExecute。 GetModuleFileName 完全不同
  • 使用 System::Diagnostics::Process::Start("testt.pdf") 代替。

标签: c++ visual-c++ window


【解决方案1】:

你为什么认为打电话:

 GetModuleFileName(_T("testt.pdf"),buffer,sizeof(buffer));

会打开一个 PDF 文件吗?

这个函数定义如下:

DWORD WINAPI GetModuleFileName(
  _In_opt_  HMODULE hModule,
  _Out_     LPTSTR lpFilename,
  _In_      DWORD nSize
);

评论示例:

ShellExecuteW(
    NULL, L"open",
    L"C:\\my.pdf",
    NULL, 
    NULL,
    SW_SHOWNORMAL
);

【讨论】:

  • 感谢您的回复。你能告诉我我会修改什么来打开 PDF 吗?
  • 我认为你应该使用:ShellExecuteW(NULL, L"Open", buffer, NULL, NULL, SW_SHOWNORMAL);但在缓冲区中放置您的 pdf 的路径。
  • 我已将其更改为 TCHAR 缓冲区[MAX_PATH] = L"testt.pdf";并且应用程序仍然像在上面的代码中那样自行打开,我也尝试了与目录相同的操作,同样的情况又发生了。你能向我解释一下我会怎么做吗?对于不理解您可能认为简单的事情,我深表歉意,但我对此并不陌生,非常感谢您的帮助。谢谢
  • 也许您的应用已注册为默认打开 pdf 文件?
  • 我也试过:TCHAR buffer[MAX_PATH] = gcnew String("testt.pdf");当我按下按钮时,弹出消息显示 System.Windows.Forms.dll 中发生“System.InvalidProgramException”类型的未处理异常附加信息:公共语言运行时检测到无效程序。它可以选择继续或中断,我都尝试了,但什么也没发生。另外,我可以直接使用shellexecute打开PDF并指定目录,当我使用getmodulefilename时会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多