Как исправить ошибку «неверный доступ к памяти»? - PullRequest
0 голосов
/ 02 марта 2011
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr LoadLibrary(string lpFileName);

    [DllImport("kernel32.dll")]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport("kernel32.dll")]
    public static extern bool FreeLibrary(IntPtr hModule);

    static void Main(string[] args)
    {
        IntPtr handle = LoadLibrary(@"ItwNidSmart.dll");
        if (handle == IntPtr.Zero)
        {
            try
            {
                int hr = Marshal.GetHRForLastWin32Error();
                Marshal.ThrowExceptionForHR(hr);
            }
            catch (Exception ex)
            {
                Console.Write("Error: "+ ex.Message);
            }
        }
        IntPtr proc = GetProcAddress(handle, "InitializeModule");
    }

Я пытаюсь загрузить эту нативную библиотеку C ++ в мою Windows 7 x64, но я получил эту ошибку. Я уже построил это решение для приложения x86.

Ошибка возникает при звонке на LoadLibrary().

1 Ответ

1 голос
/ 02 марта 2011

На самом деле вы не указали точное сообщение об ошибке и строку, на которой оно появляется.Возможно ли, что вы ошибочно связываетесь с 32-битной версией ItwNidSmart.dll?

На самом деле ваши P / Invokes неверны, что может быть или не быть причиной вашей проблемы.Наиболее важной ошибкой является то, что GetProcAddress указывает имя процедуры в виде строки ANSI.Они должны читать:

[DllImport("kernel32", SetLastError=true)]
static extern IntPtr LoadLibrary(string lpFileName);

[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool FreeLibrary(IntPtr hModule);

Я не уверен, что эти ошибки действительно вызывают проблемы.


РЕДАКТИРОВАТЬ

Выв комментарии укажите, что сбой происходит при вызове LoadLibrary().Если это вызывает исключение, то единственное объяснение, которое я могу придумать, состоит в том, что ошибка заключается в DLLMain() библиотеки DLL, а не в коде C #.Если DLL была неправильной разрядности или не найдена, то LoadLibrary() вернет NULL.

Я думаю, что для решения этой проблемы вам нужно обратиться к DLL, а не к коду C #.

...