2016-10-09 4 views
0

Мне нужно перенести 32-разрядную DLL, чтобы использовать ее в 64-битных C# (а также C++) приложениях. Dll записывается в неуправляемый код delphi. Я не могу перекомпилировать dll, и единственный способ - использовать межпроцессную связь (IPC). Я ищу много времени, но я нашел не много информации. Лучший справочник, который я нашел, находится по этой ссылке: Accessing 32-bit DLLs from 64-bit code.Доступ к 32-разрядным DLL-файлам из 64-разрядного кода

Я следил за этим руководством для достижения моей цели, потому что очень часто цитируется на этом форуме. Поэтому руководство объясняет, что я должен сделать три шага:

1 ° STEP - создать 32-разрядный компонент, реализующий объект COM, который загружает и вызывает в 32-разрядную DLL, и предоставляет 32-разрядный интерфейс DLL в качестве COM-интерфейс. Так что я сделал то же самое, как описано here (пример из предыдущей ссылки):

[ComVisible(true), GuidAttribute("137AD71F-4657-4362-B9E4-C6D734F1F530")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IGetMyString 
{ 
    string GetMyString(); 
} 

[ComVisible(true), GuidAttribute("89BB4535-5A89-43a0-89C5-19A4697E5C5C")] 
[ProgId("CallPDW.Class1")] 
[ClassInterface(ClassInterfaceType.None)] 
public class Class1 : IGetMyString 
{ 
    string GetMyString() 
    { 
     ...... 
    } 
} 

Тогда я должен зарегистрировать сборку .NET COM, так что я должен использовать Regasm.exe, но вместо этого я создал программу установки Visual Studio и проект развертывания, который создает файл MSI и выполняет те же действия Regasm. Затем я контролировал редактор реестра, и я нашел HKEY, чтобы он работал. Итак, до этого шага все в порядке или, похоже, все в порядке.

2 ° ШАГ - сконфигурируйте эти COM-компоненты для внепроцессного (ООП) путем создания стандартного приложения COM + OOP (с использованием dllhost в качестве суррогатного процесса);

3 ° ШАГА - Создание 64-битный обертка DLL, который реализует один и тот же интерфейс, как исходной 32-битной DLL, импортирует COM-интерфейс COM-объект, созданный выше, переводит текущие вызовы к воздействию интерфейса в вызовы на интерфейс COM-объекта, передает параметры вызова, получает возвращаемые значения и делегирует их вызывающим абонентам;

Проблема в том, что 2 ° и 3 ° ШАГИ я не знаю, как добиться, потому что я не нашел ничего в Интернете или на форуме об этом. Поэтому мне нужна помощь для достижения шага 2 ° и 3 °. Хорошо также некоторая ссылка на другие сообщения и т. Д. Заранее спасибо.


ДРУГИЕ ДАННЫЕ (12/10/2016 - 11:10 PM): Эта библиотека разоблачить свои функции в родной 32-битной среде через два интерфейса: 1.) C/C++ заголовок с указателями на функции (WINAPI *) 2.) интерфейс .NET с P/Invoke

ответ

1

Вы на правильном пути. Вы уже создали и зарегистрировали COM-видимую DLL-оболочку, которая необходима, чтобы разоблачить методы вашей библиотеки Delphi.

Поскольку ваш x64-процесс не может вызвать эту оболочку x86, существует необходимость в суррогатном процессе. Тем не менее, нет смысла преобразовывать вашу DLL в полноценный сервер COM+, если вы не собираетесь использовать какие-либо его услуги.

Вместо этого я бы рекомендовал разместить вашу обертку DLL в суррогате COM по умолчанию. Для этого вызовите объект OLE/COM Object Viewer на основе x86, который является частью SDK Windows. Разверните узел «Все объекты» и выберите класс видимости COM. Оттуда перейдите на вкладку «Реализация» и установите флажок «Использовать суррогатный процесс». Перейдите на вкладку «Реестр» и убедитесь, что узел «AppID» теперь содержит запись [DllSurrogate]. Примечание. Если вам необходимо автоматизировать этот шаг, вам нужно будет записать соответствующие значения в реестр самостоятельно, вручную или через процедуру настройки.

Теперь вы можете создать экземпляр класса видимых COM-классов с вашего хоста x64.

+0

HI @Aurora. Большое спасибо за ответ. Хорошо, это работает до тех пор, пока «... не войдет в запись [DllSurrogate]». – bob

+0

Теперь я хочу автоматизировать это. У вас есть совет? Кроме того, я хотел бы также создать DLL-оболочку для класса видимости COM-класса, чтобы использовать непосредственно другую DLL для вызова функций на моем хосте x64. – bob

+0

Вы запустили 'oleview' с полными правами администратора (Запуск от имени администратора)? Вам понадобятся соответствующие права для записи в реестр. Если вы хотите записать записи 'DllSurrogate' вручную, взгляните на [это] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms691260 (v = vs.85) .aspx) ссылка. Что касается вашей второй DLL: вы можете открыть функции 'P/Invoke' через вашу COM-видимую оболочку. Просто добавьте новый метод к вашему интерфейсу и классу, который вызывает соответствующую функцию. – Aurora