请问,如何把以下申明为可视接口呢?
在VB里一旦使用 Implements IEnumVarCool.IEnumVar
就说不是可执行的有效界面,但这是从另一个.tlb里复制出来的源码呀,
原来的tlb是可以申明接口的。
区别只在于开头多了两行
interface IEnumVar;
interface IUnknown;但若加上这两行,就无法生成 tlb!!!请问各位老大怎么办?还有顺便问一下,下面的两个API,在ODL里如何申明?Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Declare Function OleTranslateColor Lib "OLEPRO32.DLL" (ByVal OLE_COLOR As Long, _
ByVal HPALETTE As Long, pccolorref As Long) As Integer以下为我的OLD
===========================
[
uuid(20060410-0000-0000-0000-000000000001),
version(1.0),
helpstring("MicroGold IEnumVariant By Rick 1.0")
]
library IEnumVarCool
{
typedef struct tag_GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} _GUID;
[
odl,
uuid(20060410-0000-0000-0000-000000000002)
]
interface IUnknown {
HRESULT _stdcall QueryInterface(
[in] _GUID* riid,
[out] void** ppvObject);
unsigned long _stdcall AddRef();
unsigned long _stdcall Release();
};
[
odl,
uuid(00020404-0000-0000-C000-000000000046),
helpstring("MicroGold IEnumVariant By Rick")
]
interface IEnumVar : IUnknown {
HRESULT _stdcall Next(
[in] long cElements,
[in, out] VARIANT* aVariants,
[in] long lpcElementsFetched);
HRESULT _stdcall Skip([in] long cElements);
HRESULT _stdcall Reset();
HRESULT _stdcall Clone([in, out] IEnumVar** lppIEnum);
HRESULT _stdcall GetItems(
[in] long cElements,
[in, out] VARIANT* aVariants,
[in] long lpcElementsFetched,
[in, out] long* lRetVal);
};};
在VB里一旦使用 Implements IEnumVarCool.IEnumVar
就说不是可执行的有效界面,但这是从另一个.tlb里复制出来的源码呀,
原来的tlb是可以申明接口的。
区别只在于开头多了两行
interface IEnumVar;
interface IUnknown;但若加上这两行,就无法生成 tlb!!!请问各位老大怎么办?还有顺便问一下,下面的两个API,在ODL里如何申明?Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Declare Function OleTranslateColor Lib "OLEPRO32.DLL" (ByVal OLE_COLOR As Long, _
ByVal HPALETTE As Long, pccolorref As Long) As Integer以下为我的OLD
===========================
[
uuid(20060410-0000-0000-0000-000000000001),
version(1.0),
helpstring("MicroGold IEnumVariant By Rick 1.0")
]
library IEnumVarCool
{
typedef struct tag_GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} _GUID;
[
odl,
uuid(20060410-0000-0000-0000-000000000002)
]
interface IUnknown {
HRESULT _stdcall QueryInterface(
[in] _GUID* riid,
[out] void** ppvObject);
unsigned long _stdcall AddRef();
unsigned long _stdcall Release();
};
[
odl,
uuid(00020404-0000-0000-C000-000000000046),
helpstring("MicroGold IEnumVariant By Rick")
]
interface IEnumVar : IUnknown {
HRESULT _stdcall Next(
[in] long cElements,
[in, out] VARIANT* aVariants,
[in] long lpcElementsFetched);
HRESULT _stdcall Skip([in] long cElements);
HRESULT _stdcall Reset();
HRESULT _stdcall Clone([in, out] IEnumVar** lppIEnum);
HRESULT _stdcall GetItems(
[in] long cElements,
[in, out] VARIANT* aVariants,
[in] long lpcElementsFetched,
[in, out] long* lRetVal);
};};
[
uuid(20060410-0000-0000-0000-000000000001),
version(1.0),
helpstring("MicroGold IEnumVariant By Rick 1.0")
]
library IEnumVarCool
{
typedef struct tag_GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} _GUID;
[
odl,
uuid(00000000-0000-0000-C000-000000000046)
]
interface IUnknown {
HRESULT _stdcall QueryInterface(
[in] _GUID* riid,
[out] void** ppvObject);
unsigned long _stdcall AddRef();
unsigned long _stdcall Release();
};
[
odl,
uuid(00020404-0000-0000-C000-000000000046),
helpstring("MicroGold IEnumVariant By Rick")
]
interface IEnumVar : IUnknown{
HRESULT _stdcall Next(
[in] long cElements,
[in, out] VARIANT* aVariants,
[in] long lpcElementsFetched);
HRESULT _stdcall Skip([in] long cElements);
HRESULT _stdcall Reset();
HRESULT _stdcall Clone([in, out] IEnumVar** lppIEnum);
HRESULT _stdcall GetItems(
[in] long cElements,
[in, out] VARIANT* aVariants,
[in] long lpcElementsFetched,
[in, out] long* lRetVal);
};[
uuid(64675049-3A82-101B-8181-00AA003743D3),
dllname("kernel32.dll")
]
module Kernel32
{
[
usesgetlasterror,
entry("RtlMoveMemory")
]
void _stdcall CopyMemory([in,out]void* pvDst,
[in,out]void* pvSrc,[in] long cbCopy);
}
[
uuid(64675049-3A82-101B-8181-00AA003743D4),
dllname("OLEPRO32.DLL")
]
module OLEPRO32
{
[
usesgetlasterror,
entry("OleTranslateColor")
]
long _stdcall OleTranslateColor (
[in] long clr, //Color to be converted into a COLORREF
[in]long hpal, //Palette used for conversion
[in,out]long *pcolorref //Pointer to the caller's variable that
// receives the converted result
);
}};
IUnknown的接口IID一定会是{00000000-0000-0000-C000-000000000046}
谢谢老大,还有一个问题,API定义中[in]long hpal 那VB中看到的是否ByRef?
那就是说,VB代码中一定要用到ByVal的时候,还要手动写上?
(比如SendMessage的最后一个参数)那不是比直接在VB中定义更麻烦?