#include <string>
#include <boost/filesystem.hpp>
#include <Windows.h>
using namespace std;
static string my_exe(void){
char buf[MAX_PATH];
DWORD tmp = GetModuleFileNameA( NULL, // self
buf, MAX_PATH);
return buf;
}
int main() {
string dircmd = "dir ";
boost::filesystem::path p( my_exe() );
//boost::filesystem::path dir = p.parent_path();
// transform c:\foo\bar\1234\a.exe
// into c:\foo\bar\1234\1234.asm
p.remove_filename();
system ( (dircmd + p.string()).c_str() );
auto subdir = p.end(); // pointing at one-past the end
subdir--; // pointing at the last directory name
p /= *subdir; // append the last dir name as a filename
p.replace_extension(".asm");
system ( (string("type ") + p.string()).c_str() );
// std::cout << "Hello, world!\n";
}
... code of functions you want to see the asm for goes here ...
type是 cat的 DOS 版本。我不想包含更多的代码,这会使我更难找到我想要的函数。(虽然使用 std: : string 和 ost 与这些目标背道而驰!一些 C 风格的字符串操作对它处理的字符串做了更多的假设(并且通过使用一个大缓冲区忽略了最大长度的安全性/分配) ,对于 GetModuleFileNameA的结果来说,总的机器代码要少得多
IDK 为什么,但 cout << p.string() << endl只显示基名(即文件名,没有目录) ,即使打印它的长度表明它不只是裸名。(Chromium48 on Ubuntu 15.10).在 cout中的某个位置,或者程序的标准输出和 Web 浏览器之间,可能有一些反斜杠转义处理。