较旧的代码无法获取DLL的句柄

时间:2012-03-28 10:03:51

标签: c# dllimport

我有一些旧的代码似乎无法在64位Windows 7上运行。没有试过32位Windows 7,但绝对适用于32位XP。

该代码最初源自本文http://www.codeproject.com/KB/cs/DynamicInvokeCSharp.aspx

我已阅读this question,其中指出kernel32.dll仍然存在。

[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
private static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
private static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

[DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
private static extern bool FreeLibrary(int hModule);

[DllImport("kernel32.dll")]
private static extern bool SetDllDirectory([M

arshalAs(UnmanagedType.LPStr)] string lpPathName);

这就是它的用法:

public void Init(string dllName)
{
    DllName = dllName;
    SetDllDirectory(Path.GetDirectoryName(dllName));
    hModule = LoadLibrary(Path.GetFileName(dllName));
    if (hModule == 0)
        throw new Exception("Cannot load dll " + dllName);
}

我得到的问题是LoadLibrary始终为句柄返回0

我也试过hModule = LoadLibrary(dllName);

任何人都可以说明为什么它可能不起作用,或者我应该做什么呢?

1 个答案:

答案 0 :(得分:1)

(根据答案评论)

大多数Windows API函数调用名为SetLastError()的例程来指示失败原因。在.NET中使用DllImport时,可以向属性添加属性以明确指示函数应该保留最后一个错误(我对默认行为不是100%肯定,但是明确保证它会发生)。

例如:

[DllImport("kernel32.dll", EntryPoint = "LoadLibrary", SetLastError = true)]
private static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

然后,您可以通过调用Marshal.GetLastWin32Error()从托管代码中获取错误代码,或者通过抛出Win32Exception throw new Win32Exception(Marshal.GetLastWin32Error())来获得更有用的异常{{1}}