Я собираюсь загрузить 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());
Пожалуйста помоги
Функция, которая экспортируется из этой 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 бит тоже.