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

(Resolvido) Inconpatible types no WinExec


Ronaldo Lanhellas

Pergunta

bom estou com o seguinte comando :

WinExec('cmd /c net use Y: '+DataConfigs.DataSet.FieldByName('PATH_FOTOS').Value, SW_ShowNormal);

porém quando vou compilar tenho o seguinte erro: [DCC Error] uFrmPrincipal.pas(99): E2010 Incompatible types: 'Variant' and 'PAnsiChar'

Então tentei por assim:

WinExec(PAnsiChar('cmd /c net use Y: '+DataConfigs.DataSet.FieldByName('PATH_FOTOS').Value), SW_ShowNormal);

mais ele da invalid typecast

o que fazer ?

Editado por Ronaldo Lanhellas
Link para o comentário
Compartilhar em outros sites

25 respostass a esta questão

Posts Recomendados

  • 0

exemplo usando o PChar e o PAnsiChar

winexec(PChar ('c:\windows\system32\mspaint.exe "c:\imagem.jpg"'),sw_show);

winexec(PAnsiChar('c:\windows\system32\mspaint.exe "c:\imagem.jpg"'),sw_show);

no seu caso tente

WinExec('cmd /c net use Y: '+PAnsiChar(DataConfigs.DataSet.FieldByName('PATH_FOTOS').Value), SW_ShowNormal);

ou

WinExec(PAnsiChar('cmd /c net use Y: ')+PAnsiChar(DataConfigs.DataSet.FieldByName('PATH_FOTOS').Value), SW_ShowNormal);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

então tente substituir o valor do banco de dados e veja o que acontece

WinExec('cmd /c net use Y: '+PAnsiChar('caminho para foto'), SW_ShowNormal);

ou

WinExec('cmd /c net use Y: '+ 'caminho para foto', SW_ShowNormal);

voce deve ir testanto de todas as maneiras para poder achar o problema

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Então você vai ter que colocar o seu ClientDataSet e não o seu datasource.dataset...

se o seu cds chama CdsTeste você tem que usar ele, não importa quantos datasources você usa

WinExec(PChar('cmd /c net use Y: '+ CdsTeste.FieldByName('PATH_FOTOS').Text), SW_ShowNormal);
ou
WinExec(PAnsiChar('cmd /c net use Y: '+ CdsTeste.FieldByName('PATH_FOTOS').Text), SW_ShowNormal);

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

WinExec(PAnsiChar('cmd /c net use Y: '+ CdsTeste.FieldByName('PATH_FOTOS').Text), SW_ShowNormal);
executa sem erro, porém não faz nada, creio eu que seja .Value em vez de .text, mais se eu por .Value da erro.
WinExec(PChar('cmd /c net use Y: '+ CdsTeste.FieldByName('PATH_FOTOS').Text), SW_ShowNormal);

Não executa, da erro (diferentes tipos AnsiChar e Char)

Link para o comentário
Compartilhar em outros sites

  • 0

Certo então faz a mesma coisa com o WinExec

DataConfigs.DataSet.Open;
WinExec(PAnsiChar('cmd /c net use S: '+ DataConfigs.DataSet.FieldByName('PATH_FOTOS').AsString), SW_ShowNormal);

Outra coisa, que comando é esse que você está querendo fazer??? net use S:... o que isso faz?

Abraços

--------------------------------------

Edit: Já saquei, você tá querendo mapear uma unidade de rede!

Link para o comentário
Compartilhar em outros sites

  • 0

Ronaldo Lanhellas, experimente algo assim:

procedure ....
var
  CommandLine :String;
begin
  DataConfigs.DataSet.Open;
  ... // posiciona no registro desejado
  CommandLine := Format('cmd /c net use S: %s', [DataConfigs.DataSet.FieldByName('PATH_FOTOS').AsString]);
  WinExec(PAnsiChar(CommandLine), SW_ShowNormal);
  ... // faça qualquer outra coisa que necessite
end;

Link para o comentário
Compartilhar em outros sites

  • 0

ficou assim

procedure TFrmPrincipal.BitBtn1Click(Sender: TObject);
var
  CommandLine :String;
begin
  DataConfigs.DataSet.Open;
  // posiciona no registro desejado
  CommandLine := Format('cmd /c net use S: %s', [DataConfigs.DataSet.FieldByName('PATH_FOTOS').AsString]);
  WinExec(PAnsiChar(CommandLine), SW_ShowNormal);
  // faça qualquer outra coisa que necessite
  end;

fiz um botão com o codigo acima, mais clicando nele não acontece nada, isto é, não mapeia a unidade de rede que eu quero

Link para o comentário
Compartilhar em outros sites

  • 0

Aparentemente, apesar de usar SW_ShowNormal para que a janela do terminal seja mostrada, ela está sendo fechada e você não tem como avaliar o que está ocorrendo. Experimente remover o "/C" e veja se a janela do terminal fica ativa para você observar qualquer mensagem de erro. (link sobre os parâmetros para cmd).

Pode estar ocorrendo erro, no caso de o string do path ser longo, com espaços. Nestes casos, você deveria colocar o path entre aspas:

CommandLine := Format(Format('cmd /c net use S: "%s"', [DataConfigs.DataSet.FieldByName('PATH_FOTOS').AsString]);

Experimente.

De qualquer modo, em se tratando de aplicação windows, eu acho que seria mais conveniente utilizar a API do windows para realizar o mapeamento. Há funções para rede

Veja dois exemplos: simples e outro mais completo (onde server deve ser entendido como o nome do computador compartilha a pasta a ser mapeada; e a senha é no caso de ser necessária para a conexão, quando não é aberta a todos usuário).

Link para o comentário
Compartilhar em outros sites

  • 0

Ola Ronaldo, Primeiro gostaria de saber qual a versão do Delphi?

se for 2009/2010 você pode tentar desta forma.

WinExec(PAnsiChar(AnsiString(VARIALVEL)),0);

tb seria mais facil você separar o COMMAND LINE numa variavel.

var

VARIAVEL : string;

VARIAVEL := 'cmd /c net use X: '+ CdsTeste.FieldByName('PATH_FOTOS').AsString;

e boa sorte!

Link para o comentário
Compartilhar em outros sites

  • 0

uso o delphi 2010, tentei o seguinte comando :

procedure TFrmPrincipal.BitBtn1Click(Sender: TObject);
var
  CommandLine :String;
begin
  CommandLine :='cmd /c net use S: '+DataConfigs.DataSet.FieldByName('PATH_FOTOS').AsString;
  WinExec(PAnsiChar(AnsiString(CommandLine)),0);
  end;

e não acontece nada ao clicar no botão

Em resposta ao Micheus, tirei o "/C" e não mostrou nenhum mensagem de erro !

PS: A unica coisa que eu quero fazer é mapear uma unidade de rede baseada em um caminho que tenho no meu banco de dados, apenas isso, se houve outra forma de fazer isso, diga-me porfavor

Editado por Ronaldo Lanhellas
Link para o comentário
Compartilhar em outros sites

  • 0

Ronaldo Lanhellas, dei uma olhada em minhas coisas em casa. Agora vai (já testei aqui)

Reescreva ela usando ShellExecute (já postei sobre ele antes) que é o mais adequado. WinExec é para as versões antigas do Windos (98 para trás se não me engano).

Voce precisa acrescentar à cláusula uses a unit ShellAPI

CommandLine := Format('/c net use S: %s', [DataConfigs.DataSet.FieldByName('PATH_FOTOS').AsString]);
  ShellExecute(0, nil, PChar('cmd.exe'), PChar(CommandLine), nil, SW_SHOWNORMAL);

p.s.: Talvez em algum momento você precise "desmapear", ou pelo menos, verificar se já não existe o mapeamento - não esqueça disto.

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0

dei mais um Dataset.open , fica um tempinho na tela do DOS depois some, e não mapeia a unidade q eu quero

agora pelo menos aparece a tela do DOS, mais ainda assim não fez nada :(

CONSEGUI .. GRAÇAS A DEUS E A VOCÊS DEPOIS DE UNS 5 DIAS DE LUTA .. uashduha

muito obrigado mesmo

Editado por Ronaldo Lanhellas
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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...