2011-06-24 91 views
0

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

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

+0

如何隐藏它在一个子“bin”文件夹?另外,你可以检查它是否是由A.exe产生的,我认为。 – Xeo

+0

我已经做了验证,以确保B.dontrun由A.exe启动(如果通信未设置,如果特殊cmd行标记未通过,toolhelp.dll等),但我想为了避免“我一直尝试启动B.exe但没有任何反应!”的糟糕用户体验! – poday

+1

@poday:不要。把它放在一个“bin”文件夹中,你应该没问题,没有人担心这个。看看主要的应用程序,没有人会阻止你启动子分区。 – Xeo

回答

0

您应该创建隐藏文件。

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

文档浏览:http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

+0

不幸的是,我无法控制可执行文件的部署。我可以将B.dontrun复制到B.exe,但这需要用户具有写保护权限。 – poday

2

至少截至及包括Windows XP,在[CMD.EXE]命令解释器识别PE可执行这样无论文件的扩展名,并运行它。

这是一个原因,为什么这不是一个好主意,开始以字母“MZ”文本文档... ;-)

而这意味着它’不是一个好主意,试图阻止通过文件名称修改执行。

取而代之,使其他进程成为DLL,并通过rundll32启动它。

干杯&心连心,

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

相关问题