Как вызвать функции COM DLL (в VC ++) из приложения VC ++ .EXE? - PullRequest
7 голосов
/ 24 октября 2010

У меня есть COM DLL (скажем, xyz.dll), закодированный в VC ++. Я хочу создать вызывающее EXE-приложение (Call.exe), которое будет вызывать функции COM DLL (xyz.dll).

Я следовал инструкциям по ссылке http://www.codeproject.com/kb/DLL/XDllPt1.aspx. Но я не могу подключить DLL и EXE и, следовательно, не могу вызвать функции COM DLL. Я совершенно новичок в программировании COM и VC ++. Может ли кто-нибудь любезно помочь мне.

Я использую Visual Studio 2005.

Это точные шаги, которые я выполнил --------

ШАГ 1 : Создано решение, имеющее проект проекта DLL (xyz.dll) и проект приложения вызывающего абонента (call.exe) шаблона приложения MFC (на основе диалога). Сделал это вызвав .exe как стартовый проект ..

ШАГ 2: Перешли к свойствам, щелкнув правой кнопкой мыши на файле application.exe в обозревателе решений. Свойства конфигурации -> C / C ++ -> Общие -> Дополнительные директивы включения и добавили путь к проекту DLL.

Шаг 3: Снова щелкните правой кнопкой мыши на приложении call.exe. Проект перешел в Свойства -> Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости и добавлен путь к файлу .Lib для встроенного проекта DLL.

ШАГ 4: Щелкните правой кнопкой мыши по вызову приложения application Project , Свойства -> Общие свойства -> Ссылки -> Добавлена ​​ссылка на DLL.

ШАГ 5: Скопировал файл xyz.dll в каталог проекта приложения.

ШАГ 6: В моей DLL много заголовочных файлов и соответствующих исходных файлов. Итак, все мои файлы заголовков, присутствующие в проекте DLL, добавлены в мою прикладную программу call.exe. В функции OnInitDialog (), присутствующей в одной из .CPP-программ приложения вызывающего.exe, я вызывал функции DLL.

Только заявления

Cx objname; objname.func ();

Здесь Cx - имя класса в DLL.

Я не вносил никаких изменений в параметры конфигурации проекта EXISTING DLL, потому что это DLL, которая уже подготовлена ​​экспертом, и я пишу только вызывающее аплодисмент для вызова функций, присутствующих в этой DLL.

СПАСИБО ЗА ПРЕДЕЛА.

1 Ответ

10 голосов
/ 24 октября 2010

Следующие инструкции предназначены для вызова функций в обычной DLL, а не в COM DLL.Для доступа к COM DLL вам нужно пройти через COM.

Вы не ссылаетесь на файл lib DLL или не включаете какие-либо заголовки, и вам не нужно перемещать DLL.

Сначала убедитесь, что DLL зарегистрирована, запустив на ней regsvr32.

regsvr32 "c:\..\..\xyz.dll" ; insert the correct path

Затем добавьте директиву #import в stdafx.h вашего проекта, содержащую путь к DLL.

#import "c:\..\..\xyz.dll" // insert the correct path

Щелкните правой кнопкой мыши stdafx.cpp в представлении файла и выберите compile .Это сгенерирует классы «умного указателя» для оболочки, необходимые для доступа к вашей DLL.Классы интеллектуальных указателей имеют те же имена, что и интерфейсы в вашей DLL, но с «Ptr» в конце.

Посмотрите на файл с расширением .tlh и таким же именем, как у вашей DLL в вашей директории отладки.,Он начинается с объявления пространства имен C ++.Это пространство имен, в котором находятся объекты, которые вы собираетесь создать из DLL.

Скажите, что пространство имен XYZ , и вы хотите создать экземпляр объекта Cx ,который предоставляет интерфейс Ix .Вы должны сделать:

try {
    XYZ::IxPtr obj;
    obj.CreateInstance(__uuidof(XYZ::Cx));
    obj->func();
} catch (_com_error e) {
    printf("Error: %S\n", e.Description());
    printf("Error: %S\n", e.ErrorMessage());
}

Затем вы можете продолжать использовать его, как обычный указатель.Вы не удалите его, когда закончили с ним, однако, он будет автоматически уничтожен, когда выйдет за рамки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...