Более старый код не может справиться с DLL - PullRequest
0 голосов
/ 28 марта 2012

У меня есть какой-то старый код, который не работает на 64-битной Windows 7. Не пробовал 32-битную Windows 7, но определенно работает на 32-битной XP.

Код был первоначально получен из этой статьи http://www.codeproject.com/KB/cs/DynamicInvokeCSharp.aspx

Я прочитал этот вопрос , в котором говорится, что 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 Ответ

1 голос
/ 28 марта 2012

(согласно комментариям к ответу)

Большинство функций Windows API вызывают подпрограмму SetLastError(), чтобы указать причины сбоя. При использовании DllImport из .NET вы можете добавить свойство к атрибуту, чтобы явно указать, что функция должна сохранить эту последнюю ошибку (я не уверен на 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())

...