2012-03-28 67 views
0

我有一些旧的代码似乎无法在64位Windows 7上工作。没有尝试32位Windows 7,但绝对适用于32位XP。较旧的代码无法获得DLL的句柄

代码最初是从这篇文章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);

任何人都可以扔在为什么它可能无法正常工作任何光线,或者我应该不是做?

+0

得到一个稍微有用例外尝试编译和运行应用程序在64位机器上以32位模式运行。这只是一个猜测;但我认为有一个问题P /从64位.net应用程序调用32位DLL。 – Alxandr 2012-03-28 10:06:55

+0

@Alxandr谢谢,我忘了提及所有项目的程序集都已经在x86上。 – weston 2012-03-28 10:09:55

+0

这可能是一个尝试从x64程序或缺少的DLL加载x86 dll的问题,但尝试向您的'DllImport'语句添加'SetLastError = true',然后调用'Marshal.GetLastWin32Error()'以从'LoadLibrary' – jeffora 2012-03-28 10:10:03

回答

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())