Я столкнулся с проблемой. Я написал и 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");
}
}
}
}
Я не могу сказать вам, почему эта DLL не загружается, поскольку в этом вопросе недостаточно информации.
Подсказка: вы проверили, что ваше приложение работает в 32-разрядной или 64-разрядной версии для DLL?
Однако я могу рассказать вам, как получить дополнительную информацию о проблеме.
Сначала добавьте следующие атрибуты:
[DllImport("Kernel32.dll", SetLastError=true)]
^-----------------^
Затем добавьте это в ваш if-statement, который обрабатывает проблему:
if (ptr == IntPtr.Zero)
throw new Win32Exception();
Это должно дать вам более конкретное сообщение об исключении, указывающее на то, что может быть проблемой.
У вас есть неправильная подпись для 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();
Общие режимы отказа включают:
throw new Win32Exception();
и посмотрим, что получится.