【发布时间】:2011-04-11 21:22:33
【问题描述】:
我试图包装一个较旧的 dll,但遇到了代表它在 C# 中使用的结构的问题。我尝试过的任何事情似乎都没有奏效。有没有魔法师可以帮忙?
typedef struct _PARAM_BYNAME_DATA
{
n_char *szPntName; /* (in) point name */
n_char *szPrmName; /* (in) parameter name */
n_long nPrmOffset; /* (in) parameter offset */
PARvalue *pupvValue; /* (in/out) parameter value union */
n_ushort nType; /* (in/out) value type */
n_long fStatus; /* (out) status of each value access */
} PARAM_BYNAME_DATA;
如果有帮助,下面是一个 VB 端口。
Type param_byname_data
point_name As String
param_name As String
param_offset As Long
padding1 As Long 'for byte alignment between VB and C
param_value As Variant
param_type As Integer
padding2 As Integer 'for byte alignment between VB and C
status As Long status As Long
End Type
还有下面的 Delphi……
PARAM_BYNAME_DATA=record
PntName:pchar; // (in) point name
PrmName:pchar; // (in) parameter name
PrmOffset:longword; // (in) parameter offset
pValue:pointer; // (out) parameter value union
nType:word; // (out) value type
fStatus:longword; // (out) status of each value access */
end;
【问题讨论】:
-
由于我们不知道 n_char、n_long、PARvalue、n_ushort 和 n_long 是什么,所以很难提供帮助。 n_*** 和 *** 总是等价的吗?请告诉我们PARvalue是什么。
-
好的...在这里我认为这些是不错的普通 c 类型。我的错。我也有 VB 替代品。已更新问题。不确定 C# 中是否需要填充?
-
所以 PARvalue 是一个变体
-
顺便说一句,你的 Delphi 版本是错误的。您应该使用带符号的等效整数和短整数,而不是无符号的 longword 和 word。为什么不使用变体?