Files
Work/boneyard/Main.cpp
2024-08-07 09:12:07 -04:00

336 lines
7.7 KiB
C++

#define _COMMON_USENLS_
#include <common/windows.hpp>
#include <common/block.hpp>
#include <common/openfile.hpp>
#include <common/console.hpp>
#include <common/block.hpp>
#include <com/com.hpp>
#include <olectl.h>
#include <com/objbase.hpp>
#include <com/oleauto.hpp>
#include <com/com.hpp>
#include <com/variant.hpp>
#include <boneyard/dimg.h>
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<String> strMethodNames;
SmartPointer<IUnknown> 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;
}