2012-05-20 174 views
2

我希望从ASP Classic访问DLL的功能,我的理解是,COM是要走的路。与DLL相关复杂的C++数据类型和COM

的.H头文件看起来是这样的:

... 

struct _Data; 

typedef struct _Field 
{ 
    INT iType; 
    BOOL bChanged; 
    INT iFieldId; 
    INT iInternalFieldId; 
    INT iLenght; 
    INT iDec; 
    RW iRW; 
    union 
    { 
     DOUBLE d; 
     CHAR*  s; 
     LONG  l; 
     BOOL  b; 
     LONG  date; 
     struct _Data* data; 
    } 
    value; 
} FIELD; 

typedef struct _MetaData 
{ 
    HANDLE hHandle; 
    INT  iDatabaseId; 
    INT  iFields; 
    INT  iStructSize; 
} META; 

typedef struct _Data 
{ 
    META metaData; 
    FIELD rgField[MAX_FIELD]; 
} DATA, *PDATA; 

... 

#ifdef __cplusplus 
extern "C" 
{ 
#endif //__cplusplus 

    __declspec(dllexport) P_DATA __stdcall CreateData(INT iDatabaseId); 
    __declspec(dllexport) ERROR __stdcall GetStr(DATA* pData, INT iFieldId, CHAR** ppsValue, INT iLen); 

... 

因此,大家可以看到函数本身那么简单,但数据是相当复杂的。

我应该如何去为COM服务器定义这样的数据类型?

感谢,

巴里

回答

2

有脚本语言,如VBScript和JScript,在最IIS应用程序与ASP没有使用结构类型。您不能声明一个结构变量来接收返回值或将其传递给C++函数。

您需要将结构包装到自动化类型中。编写实现IDispatch的自动化服务器类,并将结构成员公开为简单自动化类型或其他自动化服务器类(例如具有Count和Item属性的集合类)的属性。见"Passing Structures through IDispatch" by Don Box, Microsoft Systems Journal, June 1996.