使用结构和例程参数的另一个问题

时间:2014-07-02 00:42:25

标签: delphi struct

早些时候我有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还有错误。所以雷米回答是对的。

1 个答案:

答案 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