3,245
社区成员
发帖
与我相关
我的任务
分享
IFastString *CallCreateFastSTring(const char *psz){
static IFastString * (*pfn)(const char *) =0;
if(!pfn){
const TCHAR szDLL[]=_TEXT( "FastString.DLL ");
const char szFn[]= "CreateFastSTring ";
HINSTANCWE h= LoadLibrary(szDll);
if (h)
*(FARPROC*)&pfn = GetProcAddress(h,szFN);
}
return pfn?pfn(psz):0;
}
IFastString *
CallCreateFastString(const char *char *psz,
bool bLeftToRight =true){
static IFastSTring *(*pfnlr)(const char *) =0 ;
static IFastSTring *(*pfnrl)(const char *) =0 ;
IFaastString *(**ppfn)(const char *)=&pfnlr;
const TCHAR 8pszDll=_TEXT( "FastSTring.Dll ");
if(!bLeftToRight) {
pszDll =_Text( "FastSTringRL.DLL ");
ppfn=&pfnrl;
}
if(!(*ppfn) {
const char szFn[] = "CreateFastString ";
HINSTANCE h =LoadLibrary(pszDll);
if (h)
*(FARPROC *)ppfn =GetProceAddress(h,szFn);
}
return (*ppfn)?(*ppfn)(psz):0;
}
Void *FastString::Dynamic_Cast(const char *pszType)
{
If(strcmp(pszType,”IFastString”)==0)
return static_cast<IFastString*>(this);
else If(strcmp(pszType,”IPersistentObject”)==0)
return static_cast<IPersistentObject*>(this);
else If(strcmp(pszType,”IExtensibleObject”)==0)
return static_cast<IFastString*>(this);
Return 0;
}
#include <iostream>
using namespace std;
#include <objbase.h>
void trace(const char* msg)
{
cout << msg << endl;
}
// 接口定义
interface IX : IUnknown
{
virtual void __stdcall Fx() = 0;
};
interface IY : IUnknown
{
virtual void __stdcall Fy() = 0;
};
interface IZ : IUnknown
{
virtual void __stdcall Fz() = 0;
};
// Forward references for GUIDs
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
//
// 实现接口 IX,IY(这里表示一个组件)
//
class CA : public IX, public IY
{
//IUnknown implementation
virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);
virtual ULONG __stdcall AddRef() { return 0;}
virtual ULONG __stdcall Release() { return 0;}
// Interface IX implementation
virtual void __stdcall Fx() { cout << "这里是Fx函数" << endl;}
// Interface IY implementation
virtual void __stdcall Fy() { cout << "这里是Fy函数" << endl;}
};
HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{
if (iid == IID_IUnknown)
{
trace("QueryInterface: Return pointer to IUnknown.");
*ppv = static_cast<IX*>(this);
}
else if (iid == IID_IX)
{
trace("QueryInterface: Return pointer to IX.");
*ppv = static_cast<IX*>(this);
}
else if (iid == IID_IY)
{
trace("QueryInterface: Return pointer to IY.");
*ppv = static_cast<IY*>(this);
}
else
{
trace("QueryInterface: Interface not supported.");
*ppv = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown*>(*ppv)->AddRef(); // 加计数
return S_OK;
}
//
// 创建类CA,并返回一个指向IUnknown的指针
//
IUnknown* CreateInstance()
{
IUnknown* pI = static_cast<IX*>(new CA);
pI->AddRef();
return pI ;
}
//
// 下面是各接口的IID
//
// {32bb8320-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IX =
{0x32bb8320, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};
// {32bb8321-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IY =
{0x32bb8321, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};
// {32bb8322-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IZ =
{0x32bb8322, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};
//
// 主函数(这里代表客户)
//
int main()
{
HRESULT hr;
trace("Client:获取 IUnknown指针.");
IUnknown* pIUnknown = CreateInstance();
trace("Client:获取接口IX.");
IX* pIX = NULL;
hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX);
if (SUCCEEDED(hr))
{
trace("Client:获取接口IX成功.");
pIX->Fx(); // 使用 IX.
}
trace("Client:获取接口IY.");
IY* pIY = NULL;
hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY);
if (SUCCEEDED(hr))
{
trace("Client: Succeeded getting IY.");
pIY->Fy(); // 使用 IY.
}
trace("Client:是否支持接口IZ.");
IZ* pIZ = NULL;
hr = pIUnknown->QueryInterface(IID_IZ, (void**)&pIZ);
if (SUCCEEDED(hr))
{
trace("Client:获取接口IZ成功.");
pIZ->Fz();
}
else
{
trace("Client:获取接口IZ失败,不支持接口IZ.");
}
trace("Client:用接口IX查询接口IY.");
IY* pIYfromIX = NULL;
hr = pIX->QueryInterface(IID_IY, (void**)&pIYfromIX);
if (SUCCEEDED(hr))
{
trace("Client:获取接口IY成功.");
pIYfromIX->Fy();
}
trace("Client:用接口IY查询接口IUnknown.");
IUnknown* pIUnknownFromIY = NULL;
hr = pIY->QueryInterface(IID_IUnknown, (void**)&pIUnknownFromIY);
if (SUCCEEDED(hr))
{
cout << "IUnknown指针是否相等?";
if (pIUnknownFromIY == pIUnknown)
{
cout << "Yes, pIUnknownFromIY == pIUnknown." << endl;
}
else
{
cout << "No, pIUnknownFromIY != pIUnknown." << endl;
}
}
// Delete the component.
delete pIUnknown;
return 0;
}