2013-07-30 6 views
1

Я использую сторонний компонент в своем приложении, который распространяется либо как COM-компонент, либо может ссылаться на файл .manifest. В любом случае он загружается с использованием CoCreateInstance(). Файлы, необходимые для стороннего компонента, находятся во вложенной папке. Разработчик компонента сказал мне включить файл .manifest в настройках Visual Studio 2010 (в разделе «Манифест») исполняемого файла, а загрузка компонента работает без проблем.Переместить файл манифеста в dll?

Теперь я использую сторонний компонент только из DLL, чтобы инкапсулировать функции, используемые из стороннего компонента. Я загружаю DLL динамически, используя LoadLibrary(). Использование компонента по-прежнему работает, я могу использовать компонент из DLL, который загружается EXE с файлом манифеста.

Чтобы отделить EXE от третьего компонента pary, я также хотел бы переместить манифест в DLL, где это единственное место, где используется компонент. Таким образом, каждый новый EXE, который я хотел бы написать, может использовать DLL и косвенно использовать функции. На данный момент я должен добавить mainfest в каждый новый EXE, но я не хочу этого делать.

Есть ли способ переместить манифест, используемый EXE, в DLL?

+3

Вы можете поместить манифест в DLL, но она не будет активирована автоматически. Вам нужно будет сделать это вручную, используя API контекста активации. –

+0

Немного бессмысленно заставлять нас угадывать, что содержит манифест. Но высокие шансы, что вы пытаетесь поставить лошадь после тележки, DLL можно найти только в том случае, если EXE знает, где ее искать. Для этого требуется, чтобы записи манифеста присутствовали в EXE. Если вы поместите его в DLL, EXE не сможет найти DLL, так что вы не сможете найти манифест. –

+0

EXE загружает DLL динамически, я должен был упомянуть об этом. Загрузка DLL работает, но вызов CoCreateInstance() внутри DLL завершается с ошибкой. – vividos

ответ

4

Вы можете поместить манифест в DLL, но он не может быть активирован автоматически. Возможно, вам придется сделать это вручную, используя API-интерфейс активации. Я думаю, что многое зависит от того, для чего используется манифест. Я подозреваю, что вы пытаетесь использовать бесплатный бесплатный COM, но это только предположение.

Во всяком случае, эти ссылки могут оказаться полезными для вас:

+2

И это действительно работает! Это регистрация бесплатного COM, я еще этого не знал, иначе я бы упомянул об этом. Когда я использую MFC, мне пришлось добавить некоторые вызовы в AFX_MANAGE_STATE (AfxGetStaticModuleState()); чтобы не путать вызовы функций comctl32.dll, которые также переключают контекст активации. Благодаря! – vividos

Смежные вопросы