#define _COMMON_USENLS_ #include #include #include #include #include #include #include #include #include #include #include #include class FunctionDescription : private FUNCDESC { public: FunctionDescription(void); FunctionDescription(const FunctionDescription &someFunctionDescription); FunctionDescription(const FUNCDESC &someFUNCDESC); virtual ~FunctionDescription(); FunctionDescription &operator=(const FunctionDescription &someFunctionDescription); FunctionDescription &operator=(const FUNCDESC &someFUNCDESC); MEMBERID memberID(void)const; void memberID(MEMBERID memberID); SCODE *ptrSCode(void)const; void ptrSCode(SCODE *ptrSCode); ELEMDESC *ptrELEMDESC(void)const; void ptrELEMDESC(ELEMDESC *ptrELEMDESC); FUNCKIND funcKind(void)const; void funcKind(FUNCKIND funcKind); INVOKEKIND invocation(void)const; void invocation(INVOKEKIND invocation); CALLCONV convention(void)const; void convention(CALLCONV convention); short parameters(void)const; void parameters(short parameters); short optionalParameters(void)const; void optionalParameters(short optionalParameters); short vtableOffset(void)const; void vtableOffset(short vtableOffset); short countSCodes(void)const; void countSCodes(short countSCodes); ELEMDESC returnType(void)const; void returnType(ELEMDESC returnType); WORD funcFlags(void)const; void funcFlags(WORD funcFlags); FUNCDESC &getFUNCDESC(void); private: void zeroInit(void); }; inline FunctionDescription::FunctionDescription(void) { zeroInit(); } inline FunctionDescription::FunctionDescription(const FunctionDescription &someFunctionDescription) { *this=someFunctionDescription; } inline FunctionDescription::FunctionDescription(const FUNCDESC &someFUNCDESC) { *this=someFUNCDESC; } inline FunctionDescription::~FunctionDescription() { } inline FunctionDescription &FunctionDescription::operator=(const FunctionDescription &someFunctionDescription) { memberID(someFunctionDescription.memberID()); ptrSCode(someFunctionDescription.ptrSCode()); ptrELEMDESC(someFunctionDescription.ptrELEMDESC()); funcKind(someFunctionDescription.funcKind()); invocation(someFunctionDescription.invocation()); convention(someFunctionDescription.convention()); parameters(someFunctionDescription.parameters()); optionalParameters(someFunctionDescription.optionalParameters()); vtableOffset(someFunctionDescription.vtableOffset()); countSCodes(someFunctionDescription.countSCodes()); returnType(someFunctionDescription.returnType()); funcFlags(someFunctionDescription.funcFlags()); return *this; } inline FunctionDescription &FunctionDescription::operator=(const FUNCDESC &someFUNCDESC) { FUNCDESC::memid=someFUNCDESC.memid; FUNCDESC::lprgscode=someFUNCDESC.lprgscode; FUNCDESC::lprgelemdescParam=someFUNCDESC.lprgelemdescParam; FUNCDESC::funckind=someFUNCDESC.funckind; FUNCDESC::invkind=someFUNCDESC.invkind; FUNCDESC::callconv=someFUNCDESC.callconv; FUNCDESC::cParams=someFUNCDESC.cParams; FUNCDESC::cParamsOpt=someFUNCDESC.cParamsOpt; FUNCDESC::oVft=someFUNCDESC.oVft; FUNCDESC::cScodes=someFUNCDESC.cScodes; FUNCDESC::elemdescFunc=someFUNCDESC.elemdescFunc; FUNCDESC::wFuncFlags=someFUNCDESC.wFuncFlags; return *this; } inline MEMBERID FunctionDescription::memberID(void)const { return FUNCDESC::memid; } inline void FunctionDescription::memberID(MEMBERID memberID) { FUNCDESC::memid=memberID; } inline SCODE *FunctionDescription::ptrSCode(void)const { return FUNCDESC::lprgscode; } inline void FunctionDescription::ptrSCode(SCODE *pSCode) { FUNCDESC::lprgscode=pSCode; } inline ELEMDESC *FunctionDescription::ptrELEMDESC(void)const { return FUNCDESC::lprgelemdescParam; } inline void FunctionDescription::ptrELEMDESC(ELEMDESC *ptrELEMDESC) { FUNCDESC::lprgelemdescParam=ptrELEMDESC; } inline FUNCKIND FunctionDescription::funcKind(void)const { return FUNCDESC::funckind; } inline void FunctionDescription::funcKind(FUNCKIND funcKind) { FUNCDESC::funckind=funcKind; } inline INVOKEKIND FunctionDescription::invocation(void)const { return FUNCDESC::invkind; } inline void FunctionDescription::invocation(INVOKEKIND invocation) { FUNCDESC::invkind=invocation; } inline CALLCONV FunctionDescription::convention(void)const { return FUNCDESC::callconv; } inline void FunctionDescription::convention(CALLCONV convention) { FUNCDESC::callconv=convention; } inline short FunctionDescription::parameters(void)const { return FUNCDESC::cParams; } inline void FunctionDescription::parameters(short parameters) { FUNCDESC::cParams=parameters; } inline short FunctionDescription::optionalParameters(void)const { return FUNCDESC::cParamsOpt; } inline void FunctionDescription::optionalParameters(short optionalParameters) { FUNCDESC::cParamsOpt=optionalParameters; } inline short FunctionDescription::vtableOffset(void)const { return FUNCDESC::oVft; } inline void FunctionDescription::vtableOffset(short vtableOffset) { FUNCDESC::oVft=vtableOffset; } inline short FunctionDescription::countSCodes(void)const { return FUNCDESC::cScodes; } inline void FunctionDescription::countSCodes(short countSCodes) { FUNCDESC::cScodes=countSCodes; } inline ELEMDESC FunctionDescription::returnType(void)const { return FUNCDESC::elemdescFunc; } inline void FunctionDescription::returnType(ELEMDESC returnType) { FUNCDESC::elemdescFunc=returnType; } inline WORD FunctionDescription::funcFlags(void)const { return FUNCDESC::wFuncFlags; } inline void FunctionDescription::funcFlags(WORD funcFlags) { FUNCDESC::wFuncFlags=funcFlags; } inline FUNCDESC &FunctionDescription::getFUNCDESC(void) { return *this; } inline void FunctionDescription::zeroInit(void) { ::memset(&getFUNCDESC(),0,sizeof(FUNCDESC)); } int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE /*hPrevInstance*/,LPSTR /*lpszCmdLine*/,int /*nCmdShow*/) { FunctionDescription fundDesc; Block strMethodNames; SmartPointer ppInterface; ITypeInfo *pTypeInfo; _DImgScan *pImageScanner; ComResult comResult; HRESULT result; EXCEPINFO excpInfo; ComObj comObj; comObj.createInstance(CLSID_ImgScan,DIID__DImgScan,ppInterface,InprocServer); pImageScanner=(_DImgScan*)(IUnknown*)ppInterface; UINT count(0); pImageScanner->GetTypeInfoCount(&count); comResult=pImageScanner->GetTypeInfo(0,::GetUserDefaultLCID(),&pTypeInfo); if(!comResult.success()){pImageScanner->Release();return 0;} BSTR bstrName; BSTR bstrDocString; unsigned long helpContext; BSTR bstrHelpFile; int index=1; while(true) { comResult=pTypeInfo->GetDocumentation(index++,&bstrName,&bstrDocString,&helpContext,&bstrHelpFile); if(!comResult.success())break; String strAnsiName(BString(bstrName).toString()); String strAnsiDocString(BString(bstrDocString).toString()); String strHelpFile(BString(bstrHelpFile).toString()); strMethodNames.insert(&strAnsiName); ::OutputDebugString(strAnsiName+String(";")+strAnsiDocString+String(";")+strHelpFile+String(";")+String("\n")); } Variant varResult; unsigned int argErrorIndex; comResult=pImageScanner->Invoke(0x64,IID_NULL,::GetUserDefaultLCID(),DISPATCH_METHOD,0,&varResult.getVARIANT(),&excpInfo,&argErrorIndex); if(!comResult.success()) { result=comResult.error(); pTypeInfo->Release(); pImageScanner->Release(); return 0; } comResult=pImageScanner->Invoke(0x67,IID_NULL,::GetUserDefaultLCID(),DISPATCH_METHOD,0,&varResult.getVARIANT(),0,&argErrorIndex); if(!comResult.success()) { result=comResult.error(); pTypeInfo->Release(); pImageScanner->Release(); return 0; } pTypeInfo->Release(); pImageScanner->Release(); return 0; }