从 windows 服务调用时,C++ Interop 的行为不同
C++ Interop behaves differently when called from windows service
我有一个对 C++ 库进行互操作调用的 C# 可执行文件:
[DllImport(DLL_NAME, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int Check(string name, string version, bool debug);
在 C++ 代码中,我将 std::cout 重定向到一个文件:
std::streambuf* psbuf, * backup;
std::ofstream filestr;
...
if (debug)
{
filestr.open("debug.txt");
backup = std::cout.rdbuf();
psbuf = filestr.rdbuf();
std::cout.rdbuf(psbuf);
std::cout << "some debug message" << std::endl;
std::cout.rdbuf(backup);
filestr.close();
}
当我 运行 C# 可执行文件作为控制台程序时,这工作正常,但是当我 运行 它作为 Windows 服务时,文件不是由 C++ 代码创建的.
造成这种差异的原因是什么?
实际上正在创建文件,但运行作为服务时的工作目录不同:as explained here
我有一个对 C++ 库进行互操作调用的 C# 可执行文件:
[DllImport(DLL_NAME, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int Check(string name, string version, bool debug);
在 C++ 代码中,我将 std::cout 重定向到一个文件:
std::streambuf* psbuf, * backup;
std::ofstream filestr;
...
if (debug)
{
filestr.open("debug.txt");
backup = std::cout.rdbuf();
psbuf = filestr.rdbuf();
std::cout.rdbuf(psbuf);
std::cout << "some debug message" << std::endl;
std::cout.rdbuf(backup);
filestr.close();
}
当我 运行 C# 可执行文件作为控制台程序时,这工作正常,但是当我 运行 它作为 Windows 服务时,文件不是由 C++ 代码创建的.
造成这种差异的原因是什么?
实际上正在创建文件,但运行作为服务时的工作目录不同:as explained here