C++的DLL部分定义如下:
typedef char DBITBLNAME [261];
typedef char DBINAME [32]; #ifndef UINT16
#if defined(__FLAT__)
# define UINT16 unsigned short
#else
# define UINT16 unsigned int
#endif // defined(__FLAT__)
#endif // UINT16#ifndef INT16
#if defined(__FLAT__)
# define INT16 short
#else
# define INT16 int
#endif // defined(__FLAT__)
#endif // INT16typedef struct {
DBITBLNAME szName;
UINT16 iFNameSize;
DBINAME szTableType;
UINT16 iFields;
UINT16 iRecSize;
UINT16 iRecBufSize;
UINT16 iKeySize;
UINT16 iIndexes;
UINT16 iValChecks;
UINT16 iRefIntChecks;
UINT16 iBookMarkSize;
short bBookMarkStable;
DBIOpenMode eOpenMode;
DBIShareMode eShareMode;
short bIndexed;
INT16 iSeqNums;
short bSoftDeletes;
short bDeletedOn;
UINT16 iRefRange;
XLTMode exltMode;
UINT16 iRestrVersion;
short bUniDirectional;
PRVType eprvRights;
UINT16 iFmlRights;
UINT16 iPasswords;
UINT16 iCodePage;
short bProtected;
UINT16 iTblLevel;
DBINAME szLangDriver;
short bFieldMap;
UINT16 iBlockSize;
short bStrictRefInt;
UINT16 iFilters ;
short bTempTable ;
UINT16 iUnUsed[16];
} CURProps;
typedef CURProps far *pCURProps;DBIResult DBIFN DbiGetCursorProps (
hDBICur hCursor,
pCURProps pcurProps
);
VB调用部分代码如下:
Public Type CURProps
szName(1 To 261) As Byte
iFNameSize As Integer
szTableType(1 To 32) As Byte
iFields As Integer
iRecSize As Integer
iRecBufSize As Integer
iKeySize As Integer
iIndexes As Integer
iValChecks As Integer
iRefIntChecks As Integer
iBookMarkSize As Integer
bBookMarkStable As Integer
eOpenMode As DBIOpenMode
eShareMode As DBIShareMode
bIndexed As Integer
iSeqNums As Integer
bSoftDeletes As Integer
bDeletedOn As Integer
iRefRange As Integer
exltMode As XLTMode
iRestrVersion As Integer
bUniDirectional As Integer
eprvRights As PRVType
iFmlRights As Integer
iPasswords As Integer
iCodePage As Integer
bProtected As Integer
iTblLevel As Integer
szLangDriver(1 To 32) As Byte
bFieldMap As Integer
iBlockSize As Integer
bStrictRefInt As Integer
iFilters As Integer
bTempTable As Integer
iUnUsed(1 To 16) As Integer
End TypePublic Declare Function DbiGetCursorProps Lib "IDAPI32.dll" (ByVal hcursor As Long, pcurProps As CURProps) As Integer运行后发现. CURProps结构中, 数据不对. iFields应该是Field Count, 明明表中只有10个Field, 但得到的数据却是32256. 结构中其他field数据也都不正常, 怀疑是VB对此结构体的定义与C++中的没有对齐, 但实在是找不出哪儿有问题. 请高手赐教! 急等. 多谢了.
typedef char DBITBLNAME [261];
typedef char DBINAME [32]; #ifndef UINT16
#if defined(__FLAT__)
# define UINT16 unsigned short
#else
# define UINT16 unsigned int
#endif // defined(__FLAT__)
#endif // UINT16#ifndef INT16
#if defined(__FLAT__)
# define INT16 short
#else
# define INT16 int
#endif // defined(__FLAT__)
#endif // INT16typedef struct {
DBITBLNAME szName;
UINT16 iFNameSize;
DBINAME szTableType;
UINT16 iFields;
UINT16 iRecSize;
UINT16 iRecBufSize;
UINT16 iKeySize;
UINT16 iIndexes;
UINT16 iValChecks;
UINT16 iRefIntChecks;
UINT16 iBookMarkSize;
short bBookMarkStable;
DBIOpenMode eOpenMode;
DBIShareMode eShareMode;
short bIndexed;
INT16 iSeqNums;
short bSoftDeletes;
short bDeletedOn;
UINT16 iRefRange;
XLTMode exltMode;
UINT16 iRestrVersion;
short bUniDirectional;
PRVType eprvRights;
UINT16 iFmlRights;
UINT16 iPasswords;
UINT16 iCodePage;
short bProtected;
UINT16 iTblLevel;
DBINAME szLangDriver;
short bFieldMap;
UINT16 iBlockSize;
short bStrictRefInt;
UINT16 iFilters ;
short bTempTable ;
UINT16 iUnUsed[16];
} CURProps;
typedef CURProps far *pCURProps;DBIResult DBIFN DbiGetCursorProps (
hDBICur hCursor,
pCURProps pcurProps
);
VB调用部分代码如下:
Public Type CURProps
szName(1 To 261) As Byte
iFNameSize As Integer
szTableType(1 To 32) As Byte
iFields As Integer
iRecSize As Integer
iRecBufSize As Integer
iKeySize As Integer
iIndexes As Integer
iValChecks As Integer
iRefIntChecks As Integer
iBookMarkSize As Integer
bBookMarkStable As Integer
eOpenMode As DBIOpenMode
eShareMode As DBIShareMode
bIndexed As Integer
iSeqNums As Integer
bSoftDeletes As Integer
bDeletedOn As Integer
iRefRange As Integer
exltMode As XLTMode
iRestrVersion As Integer
bUniDirectional As Integer
eprvRights As PRVType
iFmlRights As Integer
iPasswords As Integer
iCodePage As Integer
bProtected As Integer
iTblLevel As Integer
szLangDriver(1 To 32) As Byte
bFieldMap As Integer
iBlockSize As Integer
bStrictRefInt As Integer
iFilters As Integer
bTempTable As Integer
iUnUsed(1 To 16) As Integer
End TypePublic Declare Function DbiGetCursorProps Lib "IDAPI32.dll" (ByVal hcursor As Long, pcurProps As CURProps) As Integer运行后发现. CURProps结构中, 数据不对. iFields应该是Field Count, 明明表中只有10个Field, 但得到的数据却是32256. 结构中其他field数据也都不正常, 怀疑是VB对此结构体的定义与C++中的没有对齐, 但实在是找不出哪儿有问题. 请高手赐教! 急等. 多谢了.
感谢你的回复, 这样也是得不到正确结果的.
在C中取得sizeof(CURProps),与VB中的Len(pcurProps)比较是否一致?
C++部分
typedef enum
{
dbiREADWRITE = 0,
dbiREADONLY = 1
} DBIOpenMode;typedef enum
{
dbiOPENSHARED = 0,
dbiOPENEXCL = 1,
} DBIShareMode;typedef enum
{
xltNONE = 0,
xltRECORD = 1,
xltFIELD = 2,
} XLTMode;typedef enum {
prvNONE = 0,
prvREADONLY = 0x01,
prvMODIFY = 0x03,
prvINSERT = 0x07,
prvINSDEL = 0x0F,
prvFULL = 0x1F,
prvUNKNOWN = 0xFF
} PRVType;VB部分:
Public Enum DBIOpenMode
dbiREADWRITE = 0
dbiREADONLY = 1
End EnumPublic Enum DBIShareMode
dbiOPENSHARED = 0
dbiOPENEXCL = 1
End EnumPublic Enum XLTMode
xltNONE = 0
xltRECORD = 1
xltFIELD = 2
End EnumPublic Enum PRVType
prvNONE = 0
prvREADONLY = &H1
prvMODIFY = &H3
prvINSERT = &H7
prvINSDEL = &HF
prvFULL = &H1F
prvUNKNOWN = &HFF
End EnumTo Chenghui530:
目前的确是怀疑未对齐, 但一时半会没找出是哪儿出了问题...To Tiger_Zhao:
对于C/C++, 只能看看源码...To All:
请各位多帮忙. 感谢.
现在无法去试. 晚点试过再请教了. 谢谢了.
你C中的enum是多少?
这里的意思是说:如果定义了UINT16
你看看*.h文件中有没有定义这个类型
C中int类型等于VB的Long类型
如果有的话,则变量类型为Integer,如果没有则为Long如果枚举的话,VB只支持Long类型,所以一般是没什么问题的
好像记得C中enum的字节数可以配置的,所以不能保证。
UINT16的定义我在最开始已经贴出来了.
#ifndef UINT16
#if defined(__FLAT__)
# define UINT16 unsigned short
#else
# define UINT16 unsigned int
#endif // defined(__FLAT__)
#endif // UINT16
因为不太理解__FLAT__的含义, 所以只是译成了integer. 之后也有尝试过long, 但采用long会报错.
这个dll是borland提供的, 事实上我也不知道是哪个编译器编译的. 我从codeproject上找到一个vc写的call这个DLL部分API的demo, 是可以正常获得数据的...之前的sizeof(CURProps)等于427也是在这个demo的环境中得到的.
Sub Main()
Dim t As CURProps, a(2 - 1) As CURProps
Debug.Print Len(t), VarPtr(a(1)) - VarPtr(a(0))
End Sub输出为:
427 432你只能用一个够大的Byte数组调用函数,然后用CopyMemory的方式逐个复制到结构中。
之前我是直接传一个结构地址给API的, 后来也试过声明一个427个元素的byte array, 然后用copymemory方式, 复制到结构中, 结果和直接传结构地址是一样的. 难得要逐个复制到结构的每个field里? 谢谢.