C # 2010 не загружает Delphi DLL

1

Я столкнулся с проблемой. Я написал и win32 DLL в delphi 2009. Теперь я хочу динамически загружать эту DLL из настольного приложения С#, но функция LoadLibray возвращает 0. Здесь CSharp-код, пожалуйста, может ли кто-нибудь помочь мне, почему DLL не загружается?

public partial class Form1 : Form
{
  [DllImport("kernel32.dll")]
  public static extern IntPtr LoadLibrary(string dllToLoad, IntPtr hFile, uint dwFlag);

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

  [DllImport("Kernel32.dll")]
  private extern static Boolean CloseHandle(IntPtr handle);


  public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        IntPtr ptr = IntPtr.Zero;
        ptr = LoadLibrary("MyDLL.dll", IntPtr.Zero, 0);

        if (ptr == IntPtr.Zero)
        {
            MessageBox.Show("DLL not laded");
        }
    }
}

}

  • 1
    Убедитесь, что ваше приложение C # работает в режиме x86.
  • 0
    Пожалуйста, проверьте, как заставить эти функции сообщать об ошибках с помощью GetLastError . Здесь вы, вероятно, можете просто добавить это в свой оператор if: throw new Win32Exception(); и посмотрим, что получится.
Показать ещё 4 комментария
Теги:
pinvoke

2 ответа

1
Лучший ответ

Я не могу сказать вам, почему эта DLL не загружается, поскольку в этом вопросе недостаточно информации.

Подсказка: вы проверили, что ваше приложение работает в 32-разрядной или 64-разрядной версии для DLL?

Однако я могу рассказать вам, как получить дополнительную информацию о проблеме.

Сначала добавьте следующие атрибуты:

[DllImport("Kernel32.dll", SetLastError=true)]
                         ^-----------------^

Затем добавьте это в ваш if-statement, который обрабатывает проблему:

if (ptr == IntPtr.Zero)
    throw new Win32Exception();

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

  • 0
    Приложение C # скомпилировано с использованием настроек x86, а Delphi DLL находится в delphi 2009, которая является 32-битной. Моя ОС Windows 7 64 бит. Я просто загружаю библиотеку, не загружая никакую процедуру DLL. Отладкой Теперь это дает мне следующую ошибку при выполнении функции LoadLibrary. Вызов функции PInvoke 'LoadLibrary' разбалансирует стек. Это вероятно потому, что управляемая подпись PInvoke не совпадает с неуправляемой целевой подписью. Убедитесь, что соглашение о вызовах и параметры подписи PInvoke соответствуют целевой неуправляемой подписи
  • 0
    Это сообщение является средой выполнения, обнаруживающей ошибку, которая описана в моем ответе.
3

У вас есть неправильная подпись для LoadLibrary. Должен быть:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllname);

У вас были два паразитных параметра и они не фиксировали код ошибки.

Всегда проверяйте наличие ошибок при вызове функций Win32. В этом случае

IntPtr lib = LoadLibrary(dllname);
if (lib == IntPtr.Zero)
    throw new Win32Exception();

Общие режимы отказа включают:

  • Неравномерная битость.
  • DLL не найден на пути поиска DLL.
  • Зависимости DLL не разрешены.
  • 0
    Именно то, что я думал!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню