复杂的C ++数据类型和COM

时间:2012-05-20 07:38:47

标签: c++ com asp-classic

我希望从ASP Classic访问dll的功能,我的理解是COM是要走的路。

与dll关联的.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服务器定义此类数据类型?

谢谢,

百里

1 个答案:

答案 0 :(得分:2)

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

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