Я пытаюсь научить себя основам COM, и с этой целью я следую вместе с курсом Кенни Керра «Основы COM» по Pluralsight. В настоящее время я застрял в разделе «Remoting» части 2, в частности, видео под названием «Demo: Определение интерфейсов Remotable». Мое текущее полное решение перечислено здесь: https://github.com/jakotheshadows/COMClient
Я дошел до бега
midl hen.idl
а затем компилировать вывод из этого с
cl /W4 /DWIN32 /DREGISTER_PROXY_DLL *.c /link /DLL rpcrt4.lib /OUT:Proxy.dll /DEF:Exports.def
тогда я делаю
regsvr32 Proxy.dll
и он говорит, что успешно зарегистрирован.
Однако, когда я добираюсь до вызова CoGetClassObject во время работы клиента:
#include "Precompiled.h"#include "..\COMServer\Server.h"#include "..\Proxy\Hen.h"
using namespace Microsoft::WRL;
int main()
{
ComRuntime runtime(Apartment::SingleThreaded);
ComPtr<IPSFactoryBuffer> proxyFactory;
HR(CoGetClassObject(__uuidof(IAsyncHenEventHandler),
CLSCTX_INPROC_SERVER,
nullptr,
__uuidof(proxyFactory),
reinterpret_cast<void**>(proxyFactory.GetAddressOf())));
ComPtr<IHen> hen;
HR(CoCreateInstance(__uuidof(Hen), nullptr, CLSCTX_INPROC_SERVER, __uuidof(hen), reinterpret_cast<void**>(hen.GetAddressOf())));
hen->Cluck();
}
Я получаю сообщение об ошибке и вижу, что CoGetClassObject возвращает HRESULT REGDB_E_CLASSNOTREG, и пример Кенни Керра, похоже, «просто работает».
ОбновитьБыло высказано предположение, что rclsid
и riid
аргументы обратны в вызове, показанном выше. Я пытался:
HR(CoGetClassObject(_uuidof(proxyFactory),
CLSCTX_INPROC_SERVER,
nullptr,
__uuidof(IAsyncHenEventHandler),
reinterpret_cast<void**>(proxyFactory.GetAddressOf())));
И я все еще сталкиваюсь с тем же HRESULT от CoGetClassObject.
Я не уверен, где я ошибся здесь. Я замечаю, что когда я проверяю Proxy.dll с помощью обходчика зависимостей, я вижу нечто иное, чем г-н Керр, когда делает это:
В частности, в моем Proxy.dll есть этот «ADVAPI32.DLL», которого нет, когда Кенни Керр проверяет Proxy.dll с зависимости от.exe. Кроме того, я вижу несколько ошибок, которые он, кажется, не получает:
- Предупреждение. По крайней мере один модуль зависимости задержки и загрузки не найден.
- Предупреждение: по крайней мере один модуль имеет неразрешенный импорт из-за отсутствия функции экспорта в модуле, зависящем от задержки и загрузки.
Другое различие между моей средой и Кенни Керром состоит в том, что я использую Visual Studio 2015, где он использует Visual Studio 2012. Я работаю в Windows 7 Professional x64.
Задача ещё не решена.
Других решений пока нет …