Fórum String X PAnsiChar #357203
15/04/2008
0
var
Str: String;
begin
Str:= dm.EDPOSTAGEMETIQUETA.Value;
shellexecute(handle, ´open´, ´http://websro.correios.com.br/sro_bin/txect01$.QueryList?P_LINGUA=001&P_TIPO=001&P_COD_UNI=´+[b:837df5860d]PChar(Str), [/b:837df5860d]NiL, NiL, SW_SHOWNORMAL);
end;
como resolver?
obrigado, aguardo

Edsant
Curtir tópico
+ 0Posts
15/04/2008
Massuda
Talvez você precise converter para PChar a URL que você está tentando abrir através do shell.
Gostei + 0
15/04/2008
Psyjacko
valeu
Gostei + 0
16/04/2008
Edsant
realmente eu estava colocando o pchar no lugar errado, acontece nas melhores familias...
obrigado massuda...
Gostei + 0
16/04/2008
Rodc
PChar é um ponteiro para o tipo Char.
Char é um caracter apenas, um byte.
Uma string é composta de uma sequência (vetor) de Char onde no fim da sequência têm um #0 (caracter zero) indicando o final do texto.
O Windows trabalha sempre com ponteiros para Char, pois a classe String é do Delphi e o Windows não a conhece. Quando você passa para a função ShellExecute o ponteiro para a sequência de caracteres (endereço de memória do primeiro caracter) o Windows percorre os próximos endereços de memória até encontrar uma posição que tenha o 0, aí ele entende que o texto da mensagem acabou alí.
Consegui explicar direito?
Gostei + 0
17/04/2008
Psyjacko
por exemplo :
nome : String
nome :=´aeiou´
que caracter nulo seria esse ?
valeu pela atenção :wink:
Gostei + 0
17/04/2008
Rodc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var nome: String; caracter: Char; begin nome := ´rodrigo´; caracter := PChar(nome)[0]; // pega o ´r´ caracter := PChar(nome)[1]; // pega o ´o´ caracter := PChar(nome)[2]; // pega o ´d´ caracter := PChar(nome)[3]; // pega o ´r´ caracter := PChar(nome)[4]; // pega o ´i´ caracter := PChar(nome)[5]; // pega o ´g´ caracter := PChar(nome)[6]; // pega o ´o´ caracter := PChar(nome)[7]; // pega o 0, que apesar de não aparecer no texto está na memória caracter := PChar(nome)[8]; // acessa um byte que não pertence mais à string. Esta parte da memória pode ser de outro componente ou função. end; |
Vá em Step-by-Step para ver o valor de ´caracter´.
Quando se faz o PChar, ele retorna o ponteiro para o primeiro byte da string. Quando faço ´PChar(nome)[1];´ o PChar me retorna o primeiro byte e depois anda um byte à frente para pegar a posição 1 do vetor.
Gostei + 0
17/04/2008
Rodc
:
1 2 3 4 5 6 | var nome: String; begin nome := ´rodrigo´; PChar(nome)[3] := Char(0); // pega o ´r´ ShowMessage(nome); end; |
Se o código acima funcionar no Delphi, você vai ver que o ShowMessage só vai mostrar ´rod´, pois na quarta posição (vetor começa no zero) tem um zero que termina a string, apesar de na memória ainda existir o resto.
Gostei + 0
17/04/2008
Psyjacko
minha dúvida mesmo é qt ao uso do PChar em certas ocasiões :?
se vc tiver msn poderia me passar , acho que conseguiria sanar a dúvida mais rápido :wink:
Gostei + 0
17/04/2008
Psyjacko
Gostei + 0
18/04/2008
Rodc
Exato, a questão é que String é uma classe do Delphi. O Windows, nem outros compiladores saberiam manipular esta classe se você passasse o ponteiro da classe para eles. Por isto é que você tem de passar direto o endereço de memória onde o texto começa, pois qualquer sistema consegue ler uma sequência de caracteres na memória até encotrar um caracter zerado.
Infelismente não tenho MSN.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)