VC DLL与DELPHI 我在VC里写了一个接口,并把其做成了动态库(DLL),其中接口的参数是一个结构指针,结构是由几个字符数组组成的。现在在DELPHI里调用该接口,在把结构传入接口前,已经为第一个字符数组赋了值,结果,调用完该接口,结构里的内容整体向后偏移了4个字节,前面填充了4个字节的乱码。而且,我在接口里面什么都不做,也是这种情况。哪位能帮我解决一下,不胜感激。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 字符数组千万不要使用 delphi 的string类型。 http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=189529 ?gz 要注意vc和delphi的数据类型转换 可能是你用的紧凑型的数组。紧凑型的数据和非紧凑型的在内存中所占的大小可是不一样的啊 !delphi 时候使用了packed 编译选项啊。 delphi 的数组和c的对应关系Delphi Size/Values C++ implementation ImplementationShortInt 8-bit integer signed char typedefSmallInt 16-bit integer short typedefLongInt 32-bit integer int typedefByte 8-bit unsigned integer unsigned char typedefWord 16-bit unsigned integer unsigned short typedefInteger 32-bit integer int typedefCardinal 32-bit unsigned integer unsigned int typedefBoolean true/false bool typedefByteBool true/false or 8-bit unsigned integer unsigned char typedefWordBool true/false or 16-bit unsigned integer unsigned short typedefLongBool true/false or 32-bit unsigned integer BOOL (WinAPI) typedefAnsiChar 8-bit unsigned character char typedefWideChar word-sized Unicode character wchar_t typedefChar 8-bit unsigned character char typedefAnsiString Delphi AnsiString AnsiString classString[n] old style Delphi string, n = 1..255 bytes SmallString<n> template classShortString old style Delphi string, 255 bytes SmallString<255> typedefString Delphi AnsiString AnsiString typedefSingle 32-bit floating point number float typedefDouble 64-bit floating point number double typedefExtended 80-bit floating point number long double typedefReal 32-bit floating point number double typedefPointer 32-bit generic pointer void * typedefPChar 32-bit pointer to characters unsigned char * typedefPAnsiChar 32-bit pointer to ANSI characters unsigned char * typedefComp 64-bit floating point number Comp classOleVariant OLE variant value OleVariant class 其中接口的参数是一个结构指针,结构是由几个字符数组组成的。写出你的结构在VC里面的定义、接口以及DELPHI的调用方式,传递参数比如typedef struct{ char szBuf[20];} MyRec,*PMyRec;那你delphi也需要相应的定义type MyRec = record szBuf: array[0..19] of char;end;PMyRec = ^MyRec;而且 如果你VC里面设置为 #pragma pack(1)的话 delphi那边还要 type MyRec = packed record... 对于不同的语言间的DLL库参数类型,不建议采用Struct,最好定义一个字符串(包含N字段),各字段之间用分隔符进行分开。这样不论在何种语言之间进行调用,也不会出现兼容问题。 关于TCP的拥塞算法 在ATL复合控件上使用非标准控件的问题 请教CxImage的问题 呼唤db2达人 在线程里面奇怪的内存错误,求救!!!!!在线等待!! createnamedpipe创建的管道如何删除 控件变量参数传递问题 就剩70分了,求助,请看一下我写的这句SQL语句哪里有问题了? 菜文,error C2440: 'type cast' : cannot convert from 'char *' to 'char [32]' 请大家看看这段程序错在那 请问DIB位图和GDI有什么关系? 一个简单的小问题,大家帮帮我
delphi 时候使用了packed 编译选项啊。
Delphi Size/Values C++ implementation ImplementationShortInt 8-bit integer signed char typedef
SmallInt 16-bit integer short typedef
LongInt 32-bit integer int typedef
Byte 8-bit unsigned integer unsigned char typedef
Word 16-bit unsigned integer unsigned short typedef
Integer 32-bit integer int typedef
Cardinal 32-bit unsigned integer unsigned int typedef
Boolean true/false bool typedef
ByteBool true/false or 8-bit unsigned integer unsigned char typedef
WordBool true/false or 16-bit unsigned integer unsigned short typedefLongBool true/false or 32-bit unsigned integer BOOL (WinAPI) typedef
AnsiChar 8-bit unsigned character char typedef
WideChar word-sized Unicode character wchar_t typedef
Char 8-bit unsigned character char typedef
AnsiString Delphi AnsiString AnsiString class
String[n] old style Delphi string, n = 1..255 bytes SmallString<n> template class
ShortString old style Delphi string, 255 bytes SmallString<255> typedef
String Delphi AnsiString AnsiString typedefSingle 32-bit floating point number float typedef
Double 64-bit floating point number double typedef
Extended 80-bit floating point number long double typedef
Real 32-bit floating point number double typedef
Pointer 32-bit generic pointer void * typedef
PChar 32-bit pointer to characters unsigned char * typedef
PAnsiChar 32-bit pointer to ANSI characters unsigned char * typedef
Comp 64-bit floating point number Comp class
OleVariant OLE variant value OleVariant class
比如
typedef struct
{
char szBuf[20];
} MyRec,*PMyRec;那你delphi也需要相应的定义
type MyRec = record
szBuf: array[0..19] of char;
end;
PMyRec = ^MyRec;
而且 如果你VC里面设置为 #pragma pack(1)的话 delphi那边还要 type MyRec = packed record...