Ir para conteúdo
Fórum Script Brasil
  • 0

Struct No Delphi (como Parâmetro De Função)


Mauro Sano

Pergunta

Bom Dia Srs.!

Preciso acessar uma dll feita em C++ que recebe como parâmetro uma struct.

A Struct original:

typedef struct

{

INT iPorta;

INT iNumTerm;

INT iNumMsg;

INT iTimeOutMsg;

LPFNPROCMSG lpfnProcMsg;

HANDLE hStopEvent;

CHAR szLogEcho[2];

CHAR szLogArqNom[256];

CHAR szLogFlags[64];

CHAR szLogMaxArq[3];

CHAR szLogMaxTam[10];

} STRPARTT;

Alguém sabe como faço para criar uma struct similar a essa? Devo usar o Type???

E a segunda, como passar essa struct no Delphy como parametro da função??

Mutio obrigado a todos!

Abraços,

Mauro Sano

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

opa

Seria mais ou menos assim, você pode definir o nome que quiser, o

fato que todos usam a letra T no inicio é somente para organização

e melhor interpretação do código, onde Type e Integer, etc

type

TSTRPARTT = record

iPorta: Integer;

iNumTerm: Integer;

iNumMsg: Integer;

iTimeOutMsg: Integer;

//LPFNPROCMSG lpfnProcMsg; Isso está faltando, você precisa passar o que é...

hStopEvent: THandle;

szLogEcho: String;

szLogArqNom: String;

szLogFlags: String;

szLogMaxArq: String;

szLogMaxTam: String;

end;

Passar como parametro seria tipo

Function Bla(StrPartt: TSTRPARTT): Boolean;

begin

with aStrPartt do

begin

iPorta := 10;

iNumTerm := 1;

//{...} agora a variavel passada recebeu estes valores acima...

end;

end;

exemplo de como passar pra rotina...

var

_StrPartt: TStrPartt;

begin

Bla(_StrPartt);

//variavel aStrPartt recebeu os valores que a função passou

Lembrando que você não poderá passar pra uma DLL por exemplo desta

maneira, se for ser passado pra DLL, vai ter que mudar algumas coisas

como substituir String por ShortString ou usar ponteiros como PChar, etc...

A não ser que a DLL seja de sua autoria, e você usou nela gerenciadores

de memória, tanto na DLL quanto no EXE

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
typedef struct
{
  INT         iPorta;
  INT         iNumTerm;
  INT         iNumMsg;
  INT         iTimeOutMsg;
  LPFNPROCMSG lpfnProcMsg;
  HANDLE      hStopEvent;
  CHAR        szLogEcho[2];
  CHAR        szLogArqNom[256];
  CHAR        szLogFlags[64];
  CHAR        szLogMaxArq[3];
  CHAR        szLogMaxTam[10];
} STRPARTT;
...
type
  TSTRPARTT = record
    iPorta: Integer;
    iNumTerm: Integer;
    iNumMsg: Integer;
    iTimeOutMsg: Integer;
    //LPFNPROCMSG lpfnProcMsg; Isso está faltando, você precisa passar o que é...
    hStopEvent: THandle;
    szLogEcho: String;
    szLogArqNom: String;
    szLogFlags: String;
    szLogMaxArq: String;
    szLogMaxTam: String;
  end;

Churc, permita-me fazer um comentário sobre a conversão:

- Quando em C são declaradas "string's" como no formato "CHAR szLogArqNom[256]", costumo entendê-las como sendo um array of char no Delphi. Devemos observar que está explícito o tamanho do campo, mesmo assim não é a mesma coisa que utilizar o shortstring, já que este não é "null terminated". Utilizando o tipo String não estamos especificando o tamanho (reservando o espaço "solicitado") em bytes ocupado pelo campo na declaração original do registro. É claro que isto poderia ser contornado utilizando a função SetLength, mas acho que não seria muito prático. Penso que seja mais prático declarar como array of char e na utilização fazer o type-cast se necessário.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Realmente Micheus você está certo!

De qualquer forma vamos passar pra ele usando array of Char rs

type
  TSTRPARTT = record
    iPorta: Integer;
    iNumTerm: Integer;
    iNumMsg: Integer;
    iTimeOutMsg: Integer;
    //LPFNPROCMSG lpfnProcMsg; Isso está faltando, você precisa passar o que é...
    hStopEvent: THandle;
    szLogEcho: array[1..2] of Char;
    szLogArqNom: array[1..256] of Char;
    szLogFlags: array[1..64] of Char;
    szLogMaxArq: array[1..3] of Char;
    szLogMaxTam: array[1..10] of Char;
  end;

O que acho engraçado, é que esta estrutura está parte inglês e parte

português, o que não quer dizer nada, mas também usa notações hungaras,

e uma array of char em notações hungaras pelo que me lembro é lpsz e não sz

eheh mas não tenho certeza faz tempo que li sobre isso, por isso confundi, mas

mesmo por tudo isso você está certo pois o código que vai usar esta estrutura

vai limitar os valores conforme o tamanho declarado...

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...