Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Claudio Neto

[Resolvido] Transformar estrutura de arquivo header em VB

Recommended Posts

Tenho um projeto modelo feito em C++.

 

Nesse projeto, há um arquivo header adicionado que contém uma declaração de uma estrutura.

Estou desenvolvendo um projeto em VB em cima da mesma dll que o exemplo usou, só que não tenho idéia de como utilizar essa estrutura do arquivo .h.

 

A estrutura seria algo assim:

int32 LinkCount;
	int32 Var1;
	int32 Var2;
	int32 Var3;
	int32 Var4;
	int32 Var5;
    int32 Var5;
    EchoCanceller Echo;
    EchoLocation EchoLocation;
	sbyte SerialNumber[ KMAX_SERIAL_NUMBER ];

Se alguém pudesse "traduzir" para mim o que significa cada parte, talvez consiga reconstruir em VB.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Claudio,

 

isso são declarações de variáveis.

as variáveis, LinkCount, var1, var2, var3, var4 e var5 são do tipo int32. Que eu julgo ser um inteiro de 32 bits.

A variável Echo, é do tipo EchoCanceller, que é um tipo definido pelo programador, em algum outro header-file.

A variável EchoLocation provavelmente dará algum erro na compilação. O nome da variável é o mesmo que o seu tipo de dado.

E por último, a variável SerialNumber é um array de sbyte's (também é um tipo definido pelo programador) de tamanho KMAX_SERIAL_NUMBER.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma struct serve para organizar dados.

Semelhante a uma classe que possua apenas propriedades públicas.

Por exemplo:

struct particula
{
    int massa;
    int velocidade;
    int aceleracao;
};

int main()
{
struct particula teste;

   teste.massa = 10;
   teste.velocidade = 54;
   teste.aceleracao = 12;

    return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poxa...

Eu não sei absolutamente nada de VB pra poder te dar uma mão...

 

Bom, qualquer coisa que precisar, tamos ai! =D

 

Abraços!

:thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Victor.

 

Esquenta não com isso, mas agradeço sua presteza, mesmo.

 

Dá mais uma ajuda então.

 

Em meu header tenho algo assim:

 

enum SystemObject
{
	Link	= 0x00,		
	LinkMon	= 0x20,		
	Channel	= 0x1000,	
	H100	= 0x200,	
	Firmware = 0x80,		
	Device	= 0x100,	
	API	= 0x150		
};
Ai depois tenho uma função assim:

 

GetDeviceConf (int32 id, int32 object, void *Data, int32 DataSize)
E no projeto está sendo chamada assim:

GetDeviceConf( i, Device + i, &devCfg, sizeof( devCfg ) );

I é o valor de um loop que foi criado, e devCfg também não é problema.

 

O que não estou entendendo é na parte do device. No header ele recebeu como valor 0x100, mas na função o object está declarado com inteiro.

E em vb não tenho como passar o valor 0x100.

O que quer dizer 0x100? Isso seria quanto para que eu pudesse substituir?

 

Obrigado novamente,

 

Cláudio Neto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dá mais uma ajuda então.

Com certeza, tamos aqui pra isso!

 

Em C/C++, podemos carregar inteiros em bases diferentes da decimal.

0x100 significa que é 100 em hexadecimal, que equivale a 1*16^2 = 256

porém, se fosse 00100 seria 100 em octal, que equivale à 1*8^2 = 64

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vixi, que viagem... kkkkk

 

Legal então, vou tentar passar como 256. Você sabe onde acho uma tabela com esses valores? Tentei procurar no google mas não achei. Provavelmente porque não sei o nome disso, rs.

 

Obrigado mais uma vez Victor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Victor, deixa eu continuar com minha dúvidas aqui, rs...

 

Nesa função que postei:

GetDeviceConf (int32 id, int32 object, void *Data, int32 DataSize)

O data está declarado como void. Que descobri que é um ponteiro. Porém o VB não trabalha com ponteiros, então consegui uma forma de "enganar o sistema", utilizando o endereço de memória da variável.

 

Agora te pergunto, quando vou passar o valor de *Data, eu preciso passar o endereço de memória mesmo da minha variável ou estou pensando besteira?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Claudio, tranquilo?

 

Seguinte,

tratando-se de um ponteiro, a função pede o endereço de qualquer coisa.

O problema, é que um void* é um ponteiro genérico, portanto não sabemos como ele será usado.

Atenção, o tipo de dado de (*Data) nós não sabemos!

Sabemos que a função espera que Data contenha um endereço de memória de alguma coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Victor.

 

Depois de muito tempo estou voltando aqui, rs. Estou meio sem tempo para mecher com isso então estou caminhando bem aos poucos.

 

Quando você disse que *Data espera o endereço de algo, mas não sabemos o que é, consegui desenrolar isso.

 

Ele espera o endereço de uma variável declarada como a estrutura que postei anteriormente.

E o retorno dessa função deve preencher os valores da estrutura.

 

Por exemplo, se eu passar:

GetDeviceConf( i, Device + i, &devCfg, sizeof( devCfg ) );

Meu retorno deverá ser:

 

devCfg.Var1 = alguma_coisa

devCfg.Var2 = alguma_coisa

devCfg.Var3 = alguma_coisa

devCfg.Var4 = alguma_coisa

etc...

 

Ainda não consegui fazer isso acontecer, mas acho que estou chegando perto, rs.

Esse post foi só para esclarecer mesmo o funcionamento, por enquanto não surgiu nenhuma dúvida. Mas se surgir posto aqui.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Victor, cá estou eu de novo.

 

Me ajuda nesse trecho aqui por favor:


char numeroA[] = "1234"
char numeroB[] = "5678"

char params[255];
sprintf(params, "destr_addr=\"%s\ orig_addr=\%s\" ", numeroA, numeroB );

Aqui pelo que entendi ele está montando uma string que ficará assim:

destr_addr="1234" orig_addr="5678".

Estou correto? E adicionando esse string na variável params.

 

Ai depois ele está enviando essa string desse jeito:

cmd.params = ( byte* ) params
Essa última parte não entendi. O que faz esse ( byte* )?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Caludio, tudo certo?

 

A parte da string está corretíssima!

=D

 

Mas, atenção, não está adicionando nada à variável params.

A variável params está recebendo aquele valor.

 

Já o (byte*) é um typecasting, isto é,

está falando para o compilador: Interprete a variável params como sendo do tipo byte* (que é um ponteiro para byte, onde byte deve ser um tipo definido pelo programador)

 

Vale lembrar que, se o programador que escreveu esse código, em C, for consistente, o tipo byte há de ter apenas um byte de tamanho. ( sizeof(byte) = 1 )

O que temos que ter em conta é se esse tipo byte é "unsigned" ou não.

Se possível, encontre a definição do tipo byte e me mostre.

 

(será algo como:

typedef qualquer_coisa byte;
)

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi sua explicação, mas viajei de como vou fazer, rs...

 

Seria a mesma coisa que transformar a string em binários?

 

Está como unsigned mesmo, está assim:

typedef unsigned char byte;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmmm,

ok, então uma variável do tipo "byte" pode representar toso os valores de 0 à 255.

 

Na verdade, aqui ja entra o conceito de ponteiros.

A variável params é um array, com 255 "casas".

O tipo de params[n] é char

Mas o tipo de params é char*

 

Vale a pena você dar uma olhada em ponteiros e arrays em C

Com certeza vai te clarear a mente!

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Puts, agora viajei... kkkkkkkk

 

Ponteiro é um endereço de memória de alguma coisa, correto?

E array é uma matriz, correto também?

 

Mas ainda sim viajei no que é que eu tenho que fazer...

 

Que complicado...

Vou tentar mais algumas coisas aqui e te digo que resultado cheguei.

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, é tranquilo.

Não manjo nada de VB e não sei até que ponto é possível, mas, com base na linha:

cmd.params = ( byte* ) params

Declare cmd.params como string, e copie o valor de params para lá.

Não precisa de mais que isso!

 

Arrays não são matrizes, e eu também não gosto de chamar arrays de vetores, como muita gente faz!

Um array é o mesmo que uma lista de coisas.

 

E a respeito dos ponteiros, sim, um ponteiro é uma variável que contém um endereço de memória.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.