#include "stdafx.h"
#include "InterFace.h"
#include <iostream.h>
#include <objbase.h>
int main(int argc, char* argv[])
{
CoInitialize(NULL);//初始化COM库 void *p;
    if (CoGetClassObject(mycomid,CLSCTX_INPROC_SERVER,NULL,beastid,(void**)&p)==S_OK)
{
cout<<"OK"<<endl;
}
else
{
cout<<"error"<<endl;
}
CoUninitialize(); return 0;
}
=====================================COM部分
STDAPI DllGetClassObject(REFCLSID rclsid,REFIID riid, LPVOID * ppv)
{
cout<<"调用了DllGetClassObject函数"<<endl;
char buff[39]={0};
LPOLESTR wszCLSID = NULL; StringFromCLSID(rclsid, &wszCLSID);//将CLSID转换成STRING
wcstombs(buff, wszCLSID, 39) ;
cout<<"请求CLSID为:"<<buff<<endl;    StringFromCLSID(riid, &wszCLSID);//将IID转换成STRING
wcstombs(buff, wszCLSID, 39) ;
cout<<"请求IID为:"<<buff<<endl; return S_OK;}
========================运行结果======================
调用了DllGetClassObject函数
请求CLSID为:{9FDB6FC7-59B8-4EF7-94D9-3A0CDA824204}
请求IID为:{E940B840-0581-44EA-AF3D-E00D99E48E19}
Press any key to continue--程序崩溃了
===============================================
为什么执行程序流程没有回到客户端MAIN函数啊,按道理说
最后回执行
cout<<"OK"<<endl;
我理解是其实类厂什么的可以忽略,因为程序流程进入DllGetClassObject
后 我们其实就已经掌握了程序运行的控制权利了不是吗

解决方案 »

  1.   

    return S_OK;改成
    return AfxDllGetClassObject(rclsid, riid, ppv);
      

  2.   

    你返回S_OK就是告诉系统,这个对象找到了,并且已经成功创建了类厂,*ppv指向类厂,因为你不知道COM库内部会做什么操作,它有可能使用返回的指针调用一些方法,但是你的指针却什么都没有,你这个指针或者指向空,或者指向一个非法地址,当然会崩溃。
    记住:在对象创建过程中,有COM系统(SCM)的参与,只有对象成功创建后,客户才是与对象直接交互。你把return S_OK 改为 return CLASS_E_CLASSNOTAVAILABLE.