intmain(int argc, char** argv) { open_file("/usr/local/ssl/openssl.cnf"); // Bad open_file("\\usr\\local\\ssl\\openssl1.cnf"); // Bad open_file(".\\usr\\local\\ssl\\openssl2.cnf"); // Good open_file("usr\\local\\ssl\\openssl3.cnf"); // Good
LoadLibrary(L"/DummyTLS/dummyTLS.dll"); // Bad LoadLibrary(L"\\DummyTLS\\dummyTLS1.dll"); // Bad LoadLibrary(L".\\DummyTLS\\dummyTLS2.dll"); // Good LoadLibrary(L"DummyTLS\\dummyTLS3.dll"); // Good
return0; }
编译好之后,把 EXE 放在 C 盘的某个文件夹下(为了更好地展示测试效果,请不要放在根目录下),打开 Process Monitor 监控 EXE 的行为。
总结如下两点:
Windows 不能正确处理 Linux 路径,不管分隔符是 / 还是 \\
这样的路径会导致进程去磁盘根目录搜索文件
Windows 正确的相对路径,应该以 .\\ 开头,或者直接以非 / 和 \\ 开头
这样的路径会使用正常的搜索逻辑(当前目录、PATH 环境变量等)
今日心得:
Process Monitor 的 NAME NOT FOUND 和 PATH NOT FOUND 都需要留意