我想知道如何在不运行可执行文件的情况下测试可执行文件。
我正在尝试编写一个返回布尔值的函数,指示程序是否会运行。
我遇到的问题是运行一个无法运行的程序会导致Windows错误消息" 16位应用程序与这个64位版本的Windows"不兼容,这根本不存在合乎需要的。
我需要建议如何修改我的代码以编程方式而不是手动跳过消息(按“确定”关闭弹出窗口太慢)。
我的代码:
try
{
Process.Start(exePath);
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return false;
}
我希望这个错误出现99.9%的时间,因为我的代码的目的是反复测试随机生成的可执行文件,直到其中一个可用。
答案 0 :(得分:1)
假设16位程序永远不会运行,您可以读取exe标头并确定它是否是PE映像。如果不是,甚至不试图运行它。下面是exe文件的hexdump。 0x3c处的字节是PE头的偏移量。如果你那么看那里你应该看到e0。现在在偏移e0,你会找到字母' PE'。
00000000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 |MZ..............|
00000010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 |........@.......|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 e0 00 00 00 |................|
00000040 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68 |........!..L.!Th|
00000050 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f |is program canno|
00000060 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20 |t be run in DOS |
00000070 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00 |mode....$.......|
00000080 2e 1c ae 49 6a 7d c0 1a 6a 7d c0 1a 6a 7d c0 1a |...Ij}..j}..j}..|
00000090 6a 7d c1 1a e2 7d c0 1a 1c e0 bb 1a 65 7d c0 1a |j}...}......e}..|
000000a0 1c e0 bd 1a 6b 7d c0 1a 1c e0 ad 1a 77 7d c0 1a |....k}......w}..|
000000b0 a9 72 9e 1a 6b 7d c0 1a 1c e0 b8 1a 6b 7d c0 1a |.r..k}......k}..|
000000c0 52 69 63 68 6a 7d c0 1a 00 00 00 00 00 00 00 00 |Richj}..........|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 50 45 00 00 64 86 04 00 30 04 ba 49 00 00 00 00 |PE..d...0..I....|