有没有办法启动没有可执行扩展名的可执行文件?

时间:2011-06-24 03:17:19

标签: c++ winapi

我有两个独立的可执行文件,A.exe& B.dontrun,其中A.exe在进行一些初始化后启动B.dontrun。然后两个进程相互通信,A.exetrun退出后退出A.exe。当B.dontrun被命名为B.exe但是如果B.dontrun被命名为其他任何东西(B.ex_或B.bin)时,使用CreateProcess并将可执行文件名作为第一个参数传递时,这一切都表现得很好,CreateProcess不会返回错误,但是这个过程也没有启动。

我希望B.dontrun被命名为不鼓励人们直接运行的东西,当他们查看他们看到A.exe和B.dontrun的目录时,并没有混淆哪个可执行文件他们应该跑步。

3 个答案:

答案 0 :(得分:2)

至少在Windows XP之前,[cmd.exe]命令解释程序无论文件扩展名如何都会识别PE可执行文件并运行它。

为什么用字母“MZ”开始一个文本文件不是一个好主意的原因之一...; - )

这意味着尝试通过文件名修改来阻止执行并不是一个好主意。

相反,将其他进程设为DLL,然后通过rundll32启动它。

干杯&第h。,

答案 1 :(得分:1)

您需要在cmd行参数中指定exe名称,而不是在应用程序名称中指定。

这有效:

  STARTUPINFO info;
  ZeroMemory(&info, sizeof(info)); info.cb = sizeof(info);
  PROCESS_INFORMATION pi;
  ZeroMemory(&pi, sizeof(pi));
  TCHAR sz[1000]; // Note: lpCommandLine must be writable
  lstrcpy(sz,  L"c:\\users\\serge\\desktop\\notepad.dontrun");
  CreateProcess(NULL, sz, NULL, NULL, FALSE, 0, NULL, NULL, &info, &pi);
  printf("Error = %u\n", GetLastError());

这确实提供了找不到文件错误(2):

  STARTUPINFO info;
  ZeroMemory(&info, sizeof(info)); info.cb = sizeof(info);
  PROCESS_INFORMATION pi;
  ZeroMemory(&pi, sizeof(pi));
  CreateProcess(L"c:\\users\\serge\\desktop\\notepad.dontrun",
    NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info, &pi);
  printf("Error = %u\n", GetLastError());

注意:在Win7 x64上测试

答案 2 :(得分:0)

您应该将文件创建为隐藏。

CreateFile有一个你可以使用的属性 FILE_ATTRIBUTE_HIDDEN 2(0x2)文件被隐藏。请勿将其包含在普通目录列表中。

此处的文档:http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx