【问题标题】:kernel32.GetDllDirectory returns error (0) when called via pinvokekernel32.GetDllDirectory 在通过 pinvoke 调用时返回错误 (0)
【发布时间】:2023-04-09 07:25:01
【问题描述】:

给定

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int GetDllDirectory(int nBufferLength, StringBuilder lpPathName);

StringBuilder tmp = new StringBuilder(10240);
if (GetDllDirectory(10240, tmp) == 0)
{
 int err = Marshal.GetLastWin32Error();
}

MSDN 声明that

如果函数成功,则返回值是复制到lpBuffer的字符串长度,以字符为单位。

我收到0,错误的是0。 这里有什么问题?

【问题讨论】:

标签: c# pinvoke kernel32


【解决方案1】:

DLL 目录的默认值为空。您看到的返回值为零只是告诉您没有可检索的内容。

您必须先将 DLL 目录设置为某个值,然后您才能期望 GetDllDirectory 返回除零以外的任何值。在致电GetDllDirectory 之前,请先致电SetDllDirectory 以说服自己。或者尝试从一个简单的 C++ 程序调用并观察完全相同的行为。

这里的文档肯定会产生误导。我不确定您如何区分实际失败与未设置值。也许GetLastWin32Error() 会在出错的情况下返回一个非零值。也就是说,故障模式很少。我个人倾向于将零视为 DLL 目录没有价值。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2011-09-25
  • 2017-12-21
  • 1970-01-01
  • 2019-09-03
相关资源
最近更新 更多