Mauro Sano Postado Março 6, 2007 Denunciar Share Postado Março 6, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Março 6, 2007 Denunciar Share Postado Março 6, 2007 opaSeria mais ou menos assim, você pode definir o nome que quiser, ofato que todos usam a letra T no inicio é somente para organizaçãoe melhor interpretação do código, onde Type e Integer, etctype 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 tipoFunction Bla(StrPartt: TSTRPARTT): Boolean;beginwith aStrPartt dobeginiPorta := 10;iNumTerm := 1;//{...} agora a variavel passada recebeu estes valores acima...end;end;exemplo de como passar pra rotina...var_StrPartt: TStrPartt;beginBla(_StrPartt);//variavel aStrPartt recebeu os valores que a função passouLembrando que você não poderá passar pra uma DLL por exemplo destamaneira, se for ser passado pra DLL, vai ter que mudar algumas coisascomo 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 gerenciadoresde memória, tanto na DLL quanto no EXEabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Mauro Sano Postado Março 6, 2007 Autor Denunciar Share Postado Março 6, 2007 Churc,obrigado brother!Vou testar e dou o feedback!Até a próxima!Abraços!Mauro Sano Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 6, 2007 Denunciar Share Postado Março 6, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Churc Postado Março 6, 2007 Denunciar Share Postado Março 6, 2007 OpaRealmente Micheus você está certo!De qualquer forma vamos passar pra ele usando array of Char rstype 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 parteportuguê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 szeheh mas não tenho certeza faz tempo que li sobre isso, por isso confundi, masmesmo por tudo isso você está certo pois o código que vai usar esta estruturavai limitar os valores conforme o tamanho declarado...abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Mauro Sano
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
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.