在idl文件里包含 这个dll的头文件 解决重定义问题。在Com对象的FinalConstruct里Load动态库。
在Com对象的FinalRelease里卸载动态库

解决方案 »

  1.   

    在com里,拆成4个属性,分别设置
      

  2.   

    包含头文件确实是个好办法,我一开始也这么用的,就是出现WINAPI那边有错误。
    现在重新写个头文件,只包含定义也不行啊~出现下面的错误:
    expecting a type specification near "adr_table_type"
      

  3.   

    直接分为四个属性的话还是会出现问题的,应为这四个属性的值是存储在连续的内存空间,中间没有空的字节。所以定义结构体的时候加上了
    #pragma pack(1)
    #pragma pack()
      

  4.   


    这是可以解决的。
    传进来的变量的空间是无所谓的,反正调用dll的接口时,还得重新组织参数
      

  5.   

    这是可以解决的。 
    传进来的变量的空间是无所谓的,反正调用dll的接口时,还得重新组织参数
    [/Quote]
    其实他的参数也可以说是一个char*类型的,不知道有没有更好的办法,这样做的话总觉得不是很好。
    一般如果要自定义结构体的话直接在idl文件中定义就可以了~但一涉及到DLL怎么就会有这么多问题呢~
    伤脑筋啊~
      

  6.   

    这个问题解决啦,包含下头文件的定义
    并且在头文件定义中以如下方式定义就可以:
    #define DECL2 __stdcall 
    #ifdef DOEXPORT 
    #define EXPORTSPEC __declspec (dllexport) 
    #else 
    #define EXPORTSPEC __declspec (dllimport) 
    #endif 
    typedef int(DECL2 *_load_tool)(char nr,char *dev,adr_table_type *addr); 在COM程序中动态调用就可以了,如:
    STDMETHODIMP Cprodave::com_load_tool(byte nr, BSTR dev, adr_table_type *addr, VARIANT *pResult)
    {
    HMODULE hmod;
    lpload_tool load_tool;
    hmod = LoadLibrary("W95_s7.dll");
    load_tool = (lpload_tool)GetProcAddress(hmod,"load_tool");
    if(pResult)
    {
    VariantInit(pResult);
    pResult->vt = VT_I4;
    pResult->lVal = load_tool(nr,cdev,addr); }
    return S_OK;
    }