2012-05-20 113 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.