描述:
用OLE view打开WINNT\SYSTEM32\stdole2.tlb可以看到有一个module块,我想知道其中的函数在VC中如何调用?
VB中直接可以stdole.LoadPicture(...),但是在VC中呢?
解决方案1:
module 里的函数是调用 dll 中的,此例为 oleaut32.dll。
由以下代码可以看出,它调的是 OleLoadPictureFileEx 和 OleSavePicture。
ITypeLib* pTypeLib = NULL;
ITypeInfo* pTypeInfo = NULL;
FUNCDESC* pFuncDesc;
MEMBERID idMember;
HRESULT hr;
INVOKEKIND invKind;
BSTR bstrDllName, bstrFuncName;
WORD dwOrdinal;
hr = CoInitialize( NULL );
if( SUCCEEDED(hr) )
{
hr = LoadTypeLib( L"stdole2.tlb", &pTypeLib );
if( SUCCEEDED(hr) )
{
TYPEATTR* ptypeaddr = NULL;
UINT uCount = pTypeLib->GetTypeInfoCount();
for(UINT i=0; i<uCount; i++)
{
pTypeLib->GetTypeInfo( i, &pTypeInfo );
pTypeInfo->GetTypeAttr( &ptypeaddr );
if( ptypeaddr->typekind == TKIND_MODULE
)
{
for( int i=0;
i<ptypeaddr->cFuncs; i++)
{
pTypeInfo->GetFuncDesc(i, (FUNCDESC**)&pFuncDesc);
idMember =
pFuncDesc->memid;
invKind =
pFuncDesc->invkind;
if( S_OK ==
pTypeInfo->GetDllEntry( idMember, invKind, &bstrDllName,
&bstrFuncName, &dwOrdinal ) )
{
SysFreeString(bstrDllName);
SysFreeString(bstrFuncName);
}
pTypeInfo->ReleaseFuncDesc(pFuncDesc);
}
}
pTypeInfo->ReleaseTypeAttr( ptypeaddr
);
}
}
CoUninitialize();
}
哈哈,这个200分好像比较容易得呀!
快给分吧,俺还差一点点分就长红毛了!
OleLoadPicture
Creates a new picture object and initializes it from the contents of a stream. This is equivalent to calling OleCreatePictureIndirect(NULL, ...) followed by IPersistStream::Load.
STDAPI OleLoadPicture(
IStream * pStream,
//Pointer to the stream that contains picture's data
LONG lSize, //Number of bytes read from the stream
BOOL fRunmode,
//The opposite of the initial value of the picture's
// property
REFIID riid, //Reference to the identifier of the interface
// describing the type of interface pointer to return
VOID ppvObj //Address of output variable that receives interface
// pointer requested in riid
);
Parameters
pStream
[in] Pointer to the stream that contains the picture's data.
lSize
[in] Number of bytes that should be read from the stream, or zero if the entire stream should be read.
fRunmode
[in] The opposite of the initial value of the KeepOriginalFormat property. If TRUE, KeepOriginalFormat is set to FALSE and vice-versa.
riid
[in] Reference to the identifier of the interface describing the type of interface pointer to return in ppvObj.
ppvObj
[out] Address of pointer variable that receives the interface pointer requested in riid. Upon successful return, *ppvObj contains the requested interface pointer on the storage of the object identified by the moniker. If *ppvObj is non-NULL, this function calls IUnknown::AddRef on the interface; it is the caller's responsibility to call IUnknown::Release. If an error occurs, *ppvObj is set to NULL.
Return Values
This function supports the standard return values E_OUTOFMEMORY and E_UNEXPECTED, as well as the following:
S_OK
The picture was created successfully.
E_POINTER
The address in pStream or ppvObj is not valid. For example, either may be NULL.
E_NOINTERFACE
The object does not support the interface specified in riid.
Remarks
The stream must be in BMP (bitmap), WMF (metafile), or ICO (icon) format. A picture object created using OleLoadPicture always has ownership of its internal resources (fOwn==TRUE is implied).