динамически загрузить OCX и получить дескриптор загруженного модуля в C #

1

Я собираюсь загрузить OCX во время выполнения и передать дескриптор загруженного ocx в другую функцию, которая является патчем, у меня есть код delphi, и он отлично работает, я хочу преобразовать его в С#, но я не знаю, как

Type    
  TDLLFunc = procedure(param1: dword);
VAR
  DLLFunc      : TDLLFunc;
  OcxDllHndle  : LongInt;
  DllHandle    : LongInt;

begin
  OcxDllHndle := LoadLibrary('SampleOcx.Dll');
  DllHandle   := LoadLibrary('Patch.dll');
  @DLLFunc    := GetProcAddress(DllHandle, 'DoPatch');
  DLLFunc(OcxDllHndle);
end;

вот код С#, но он не работает (я сделал версию AxInterter OCX):

AppDomain Domain = AppDomain.CreateDomain("TestApp", null, null);
var assemblyName = AssemblyName.GetAssemblyName(@".\AxInterop.SampleOcx.dll");
Assembly Ocx = Assembly.Load(assemblyName);
IntPtr DLLHandle = LoadLibrary(Application.StartupPath + @"\Patch.dll");
IntPtr funcaddr = GetProcAddress(DLLHandle, "DoPatch");

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate void MyFunc(int Handle);

MyFunc DLLFunc = Marshal.GetDelegateForFunctionPointer(funcaddr, typeof(MyFunc)) as    MyFunc;
IntPtr OCXHandle = Marshal.GetHINSTANCE(Ocx.GetType().Module);
DLLFunc(OCXHandle.ToInt32());

Пожалуйста помоги

Теги:
pinvoke

1 ответ

0

Функция, которая экспортируется из этой DLL Delphi, не может быть вызвана из С#. DLL Delphi экспортирует эту функцию, используя соглашение о вызове register которое является нестандартным соглашением о вызове Delphi. Вам нужно будет изменить DLL для экспорта, используя, например, stdcall.

Предполагая, что вы внесли изменения, код С# будет выглядеть так:

[DllImport("patch.dll")]
static extern void DoPatch(IntPtr moduleHandle);
....
IntPtr OcxHandle = LoadLibrary("SampleOcx.dll");
if (OcxHandle == IntPtr.Zero)
    .... handle error
DoPatch(OcxHandle);

Обратите внимание, что этот параметр не является DWORD. Это HMODULE. Это 64-разрядный тип под 64-разрядным процессом. Это заставляет меня указать, что ваша программа должна ориентироваться на x86 для работы с 32-разрядной DLL-версией Delphi. И OCX предположительно 32 бит тоже.

  • 0
    Понятно, но как тогда получить экземпляр ocx после вызова LoadLibrary?
  • 0
    Мой код демонстрирует это. Значение, возвращаемое LoadLibrary, является экземпляром. Код C # идентичен коду Delphi.

Ещё вопросы

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