请问,如何把以下申明为可视接口呢?
在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);
    };};

解决方案 »

  1.   

    我瞎改了一下
    [
      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
    );
    }};
      

  2.   

    之所以不能实现接口是因为你把IUnknown的IID写错了,
    IUnknown的接口IID一定会是{00000000-0000-0000-C000-000000000046}
      

  3.   

    原来编号是不能随便乱写的呀,呵呵:)
    谢谢老大,还有一个问题,API定义中[in]long hpal 那VB中看到的是否ByRef?
    那就是说,VB代码中一定要用到ByVal的时候,还要手动写上?
    (比如SendMessage的最后一个参数)那不是比直接在VB中定义更麻烦?
      

  4.   

    //那不是比直接在VB中定义更麻烦?本来就比直接在vb中声明麻烦,不过用这种方法声明api可以在某些程度上避免vb程序的崩溃(在使用多线程之类的危险操作的时候)
      

  5.   

    看来偶要放弃把所有的API都放到TLB中的想法喽,太危险了 :(不过,偶正在把常数定义都搬进去,也考虑把struct放进去,还是想偷懒,呵呵:)
      

  6.   

    非指针类型的就是byval传递,传的时候不必再byval了