早些时候我有problems in converting C/C++ structs to Delphi records并得到了帮助。幸运的是,struct的问题已经结束,但在项目中进一步推进,我遇到了另一个问题。 我将重复以下结构,以提高对该问题的理解:
#define CHANNEL_TAG_LENGTH 17
struct stChannelInfo
{
char ChannelTag[CHANNEL_TAG_LENGTH]; // Tag (máx 16 caracteres)
char ChannelEnabled; // Habilitado se diferente de "0"
};
// Structure with information about channels
struct stChannel
{
int ChannelNumber; // Número de canais no buffer
struct stChannelInfo *ChannelInfo; // Buffer com informações dos canais
};
在Delphi中,我使用这段代码来访问成员值:
{$POINTERMATH ON}
Type
PstChannelInfo = ^stChannelInfo;
stChannelInfo = record
ChannelTag: array[0..CHANNEL_TAG_LENGTH-1] of AnsiChar; // Tag (máx 16 caracteres)
ChannelEnabled: AnsiChar; // Habilitado se diferente de "0"
end;
// Structure with information about channels
Type
PstChannel = ^stChannel;
stChannel = record
ChannelNumber: Integer; // Número de canais no buffer
ChannelInfo: PstChannelInfo; // Buffer com informações dos canais
end;
var
DadosCanais: stChannel;
但现在我有另一个问题,就是使用这个DLL函数:
char GatherData ( const struct stChannel channelBuffer, int blockIndex);
以下是DLL的使用说明:
char GatherData ( const struct stChannel channelBuffer, int blockIndex)
Gets the equipment data from the data base, in the interval specified in the last call of "LookForAvailableChannels".
Version: 1.00
Parameters:
channelBuffer inform in the structure which are the desired channels.
blockIndex inform the desired data block index.
Returns:
char Returns "0" in case of error and "1" if everything is OK.
通过调用前一行中完成的LookForAvailableChannels()
例程来填充结构。我通常会在DadosCanais
中看到值。
所以,我在Delphi中定义了GatherData
:
function GatherData(ChannelBuffer : stChannel ; blockindex:integer):char ; stdcall; external 'Reader.dll';
并使用如下:
GatherData(Dadoscanais,0)
并且......该函数仅返回'0'
,表示该函数不起作用。我现在不知道该怎么做。
有人可以向我解释在Delphi中应该做些什么来使用这个功能吗?
请有人也可以给我一些关于这个主题的学习材料,这样我就能更好地理解发生了什么
EDIT1
我改变了我的定义雷米说,现在我收到" 0"作为回报
看看Borland 6 C ++ Builder中写的源代码,我看到了这段代码:
iBlock = 1;
if(this->deviceInterface->GatherData(*this->stChannels, iBlock)){
我是这样写的:
iBlock:=1;
if ( GatherData(DadosCanais,1) = 1 ) then
解
我进行了更多研究,发现除了类型转换问题之外,dll还有错误。所以雷米回答是对的。
答案 0 :(得分:6)
您对GatherData()
的声明是错误的。请改用:
function GatherData(const channelBuffer: stChannel; blockIndex: Integer): AnsiChar; stdcall; external 'Reader.dll';
或者:
function GatherData(const channelBuffer: stChannel; blockIndex: Integer): AnsiChar; cdecl; external 'Reader.dll';
由于在DLL的描述中不清楚DLL实际上正在使用哪种调用约定。我怀疑cdecl
。