以下这一程序段,为什么要定义typedef IUnknown * (*CREATEFUNCPTR)();typedef IUnknown * (*CREATEFUNCPTR)();
IUnknown* CallCreateInstance(char* name)
{
  ...
  ...
  CREATEFUNCPTR CreateInstance   //这是得到DLL中的CreateInstance的地址
     =(CREATEFUNCPTR)::GetProcAddress(hComponent,"CreateInstance");
  ...
  ...
  return CreateInstance;
}为什么在程序中要将IUnknown定义成typedef IUnknown * (*CREATEFUNCPTR)();直接在程序中用IUnknown*是不是一样,例如改成以下:IUnknown* CallCreateInstance(char* name)
{
  ...
  ...
  IUnknown* CreateInstance
     ...
  ...
  ...
  return CreateInstance;
}(* Name)()这种形式是怎么回事?

解决方案 »

  1.   

    不一样
    CREATEFUNCPTR CreateInstance;定义的是一个函数指针
    指向的函数类似于这样
    IUnknown* foo();
    因此可以
    CreateInstance = foo;
      

  2.   

    Wargod2002(Wargod2002) :CREATEFUNCPTR CreateInstance;定义的是一个函数指针
    指向的函数类似于这样
    IUnknown* foo();你不是将它换过来了?
      

  3.   

    当然没有
    IUnknown* foo();
    这里的foo只是一个函数名
    CREATEFUNCPTR CreateInstance;
    CreateInstance才是一个函数指针,它的类型是
    IUnknown (*)(),即 CREATEFUNCPTR
      

  4.   

    这种用法是经典的用GetProcAddress()的方法。注意在GetProcAddress()前面的那个强制转换。这也是动态加载DLL的一般方法。
      

  5.   

    接着的另一个问题:IX* pIX=NULL;
    HRESULT hr=::CoCreateInstance(CLSID_Component1,NULL,CLSCTX_INPROC_SERVER,IID_IX,(void**)&pIX);
    if(SUCCEEDED(hr))
    {
     pIX->Fx();
     pIX->Release();
    }
    以上是使用CoCreateInstance通过类厂创建组件,1.在其前面有 :: 是不是一定要加,加上是代表什么意思?2.是不是凡是 void** ppv 的形式的都是输出参数?