edutraini Posted December 1, 2021 Report Share Posted December 1, 2021 Bom dia Pessoal Migrei meu sistema para sql express usando sqlrdd e coloquei nas nuvens (locaweb) e ate agora estou muito feliz e satisfeito com a perfomance. Logico que alguma rotinas aos poucos estou reescrevendo usando comandos sql para poder ficar mais rapido Tenho duas duvidas 1 - Hoje uso o rpv para gerar os relatorios mas gostaria de usar um outro programa para que nao precisasse ficar instalando na maquina do cliente. 2 - Para atualizar a versao do executavel na maquina do cliente eu uso esse comando oXMLHTTP := CREATEOBJECT( "Microsoft.XMLHTTP" ) oADODBStream := CREATEOBJECT( "Adodb.Stream" ) oXMLHTTP:Open( "GET", "http://www.emtinformatica.com.br/site/aco32.exe", .f. ) oXMLHTTP:Send() oADODBStream:Type := 1 oADODBStream:Open() oADODBStream:Write( oXMLHTTP:ResponseBody ) oADODBStream:SaveToFile( "c:\sistema\aco32_novo.exe", 2 ) ou seja eu pego executavel aco32.exe que esta no meu http e salvo na pasta na maquina do cliente com outro nome pois no momento ele esta com o executavel aco32.exe aberto ai vem a duvida tem alguma forma que quando ele clicar no aco32.exe dentro do programa ele verificar que tem um aco32_novo.exe aonde ele fecha esse executavel renomeia a versao nova ou alguem poderia dar uma dica melhor de como atualizar o executavel Quote Link to comment Share on other sites More sharing options...
Ariston Santos Posted December 1, 2021 Report Share Posted December 1, 2021 Acredito que via arquivo de lotes você consiga. Segue uma ideia que pode ser executada pelo seu programa: if file("c:\sistema\aco32_novo.exe") IF MsgNoYes("Existe uma nova versão do sistem. Gostaria de atualizar agora?", "Nova versão") cAtuInf := "@ECHO OFF"+CRLF+; "COLOR F1"+CRLF+; 'TASKKILL /IM aco32.exe /F'+CRLF+; 'TIMEOUT /T 2 /NOBREAK'+CRLF+; // Esperar 2 segundos ignorando pressionamento de teclas 'DEL aco32.exe'+CRLF+; 'REN aco32_novo.exe aco32.exe'+CRLF+; "START aco32.exe"+CRLF+; "EXIT" if file(".\updaco32.bat") ; ferase(".\updaco32.bat") ; endif arq2 := fcreate(".\updaco32.bat") fwrite(arq2, cAtuInf) fclose(arq2) WAITRUN( GetEnv( 'ComSpec' )+' /C START .\updaco32.bat"', 0 ) SysWait(10) // Precisa disso, senão o programa prossegue com a execução ENDIF ENDIF Quote Link to comment Share on other sites More sharing options...
alex2002 Posted December 1, 2021 Report Share Posted December 1, 2021 Eduardo, pelo que entendi, você não conseguirá renomear/apagar o executável ao qual vc está utilizando. A saída é montar um executável paralelo que faz a verificação de nova versão em seu FTP e a partir daí vc roda ele em background (assim que entrar no seu aplicativo). Caso haja nova versão você avisa ao usuário e aí sim, traz a versão, mata a aplicação principal, renomeia o executável e reabre a aplicação. O meu aplicativo é assim e faz anos que não tenho problema. Qualquer coisa, entra em contato comigo que posso te ajudar. Um abraço, Alexandre Pereira Quote Link to comment Share on other sites More sharing options...
rochinha Posted December 1, 2021 Report Share Posted December 1, 2021 Amiguinhos, Deixe dar uma dica. Olhe este pequeno aplicativo e moldem para execução do aplicativo desejado. Baseado em exemplo existente no fivewin\samples // -> Sample showing how to activate and to finish an external application #include "FiveWin.ch" function Main( applicativo ) LOCAL dDate, cPath, cAPHack SET DATE BRITISH dDate := Date() cPath := cFilePath( GetModuleFileName( GetInstance() ) ) if empty( VerifyINI( "HACK", "APP", "", cPath+"HACK.INI" ) ) cAPHack := cGetFile( "*.exe", "Nome do arquivo a hackear" ) VerifyINI( "HACK", "APP", cAPHack, cPath+"HACK.INI", .t. ) VerifyINI( "HACK", "DATE", DtoC(dDate), cPath+"HACK.INI", .t. ) endif cAPHack := VerifyINI( "HACK", "APP", cAPHack, cPath+"HACK.INI" ) cAPDate := VerifyINI( "HACK", "DATE", DtoC(dDate), cPath+"HACK.INI" ) SET DEFAULT TO cPath RSetDate( CtoD( cAPDate ) ) //?"NEW",date() ShellExecute( cAPHack, "RUNAS", "", cPath, 1 ) SysWait( 10 ) RSetDate( dDate ) //?"OLD",date() return nil function RSetDate( cData ) run( "date " + DtoC( cData ) ) return .t. function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ ) oIni := TIni():New( _inifile_ ) if _grava_ = .t. oIni:Set( _section_, _entry_, _var_ ) endif return oIni:Get( _section_, _entry_, _var_, _var_ ) #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> // ShellExecute( cFile, cOperation, cParams, cDir, nFlag ) HB_FUNC( SHELLEXECUTE ) { hb_retnl( (LONG) ShellExecute( GetActiveWindow(), ISNIL(2) ? NULL : (LPCSTR) hb_parc(2), (LPCSTR) hb_parc(1), ISNIL(3) ? NULL : (LPCSTR) hb_parc(3), ISNIL(4) ? "C:\\" : (LPCSTR) hb_parc(4), ISNIL(5) ? 1 : hb_parni(5) ) ) ; } #pragma ENDDUMP O executável resultante muda a data do windows para uma data anterior, executa o aplicativo e depois retorna a data ao dia atual. Ok. Mas não é este o intuíto. O intuíto é executar um aplicativo através das informações no .INI. Para tal sugiro que o nome do aplicativo seja nome.numero.exe exemplo clientes.34587.exe onde o numero pode ser um sequencial de controle de versão. Supondo que se esteja ativo no cliente o clientes.34587.exe e seja necessário atualizar para clientes.34588.exe bastaria que o nome do novo arquivo seja re-escrito no .INI. Ao executar o iginidor ele saiba qual direção tomar. Caso seja necessário retornar a versão anterior basta re-escrever o .INI com o numero de versão mais estável. Quote Link to comment Share on other sites More sharing options...
alex2002 Posted December 1, 2021 Report Share Posted December 1, 2021 Vou postar aqui o fonte do meu atualizador. Qualquer coisa é só chamar. Um abraço, ///////////////////////////////////////////////////////////// #include "fivewin.ch" STATIC oDlg, oTxt, oRas, oMeter, oRecup, oAtualiza, oSair ////////////////////// Function Main() local oIni parameters cSistema, cPerfil, cPar1, cPar2 public lSair := .f. public lCheck := .f. public lUpLoad := .f. public lQuiet := .f. public cTxt public cLogFile := 'ftplog.txt' public cRecup := '' public cArquivo public cLocal := CurDrive()+':\'+Curdir() public cPasta := '/livecred' public oFtp Set Date Brit Set Century On Set 3DLook On DEFAULT cSistema := 'NomeDoSistema' // Verificando se o Sistema já está aberto if isExeRunning( 'LiveCRED.exe' ) Return .f. endif if cSistema = '/check' lCheck := .t. lQuiet := .t. cSistema := cPerfil cPerfil := cPar1 endif if cSistema = '/quiet' lQuiet := .t. cSistema := cPerfil cPerfil := cPar1 endif if cSistema = '/upload' lUpLoad := .t. cSistema := cPerfil cPerfil := cPar1 endif DEFAULT cPerfil := '1' cArquivo := rtrim( lower(cSistema) )+'.zip' cTxt := 'Início' nAtual := 0 if !lCheck DEFINE ICON oIcon RESOURCE 'LiveCRED' DEFINE DIALOG oDlg RESOURCE "Live_A" Title "LiveCRED Versão 2.3" Icon oIcon redefine Get oTxt Var cTxt Memo id 101 Color nRgb(0,0,220),nRgb(253,252,213) Of oDlg redefine Say oRecup Var cRecup id 102 Color nRgb(150,0,0) of odlg redefine Meter oMeter Var nAtual Total 100 id 103 Of oDlg redefine BUTTON oAtualiza id 501 ACTION (oAtualiza:Disable(), oSair:Disable(), Atualiza(), oAtualiza:enable(), oSair:enable() ) CANCEL redefine BUTTON oSair id 510 ACTION (lSair:= .t., oDlg:end() ) CANCEL ACTIVATE DIALOG oDlg CENTERED valid lSair on init iniciar() else ChecaVersao() endif return .t. ///////////////////////// static function iniciar() oDlg:SetFocus() oDlg:show() oAtualiza:setfocus() oAtualiza:refresh() oDlg:refresh() SysRefresh() if lCheck // Visualiza('Verificando se existe nova versão disponível, aguarde...') // oAtualiza:disable() // oSair:Disable() ChecaVersao() elseif lQuiet oAtualiza:disable() oSair:Disable() Atualiza() lSair := .t. oDlg:end() hb_gcAll() elseif lUpload oAtualiza:disable() oSair:Disable() EnviaVersao() else visualiza('Clique em Executar para que a sua versão do '+upper(cSistema)+' seja automaticamente atualizada') endif return nil Function ChecaVersao() LOCAL lRetorno := .T. local lErro := .f., lAchou := .f., lTemVersaoNova := .f., lAtualiza := .f. local i local dDataRemoto, dDataLocal, cHoraRemoto, cHoraLocal, nTamRemoto, nTamLocal cArqLocal := cLocal+'\'+cSistema+'.zip' cArqRemoto := cArquivo for i = 1 to 2 if Conecta( i ) visualiza( "Conexão estabelecida, Verificando se existe Atualização..." ) oFtp:Cwd(cPasta) aArquivo := oFTP:listfiles( cArqRemoto ) if len( aArquivo ) = 0 lRetorno := .f. // visualiza('Atualização não encontrada! **** ERRO **** ') else // dDataRemoto := aArquivo[1,3] // cHoraRemoto := aArquivo[1,4] nTamRemoto := aArquivo[1,2] endif oFTP:Close() else lRetorno := .f. endif if lRetorno exit endif next if lRetorno if file( cArqLocal ) // dDataLocal := fDate( cArqLocal ) // cHoraLocal := substr( fTime( cArqLocal ),1,5) nTamLocal := fsize( cArqLocal ) else // dDataLocal := ctod( '01/01/2000' ) // cHoraLocal := '00:00' nTamLocal := 0 endif if nTamRemoto <> nTamLocal lTemVersaoNova := .t. endif /* if dDataRemoto > dDataLocal lTemVersaoNova := .t. elseif dDataRemoto = dDataLocal if cHoraLocal < cHoraRemoto cTempo := elaptime( cHoraLocal, cHoraRemoto ) else cTempo := elaptime( cHoraRemoto, cHoraLocal ) endif nTempo := val(substr( cTempo,1,2))*60 + val(substr( cTempo,4,2)) if nTempo > 210 // 3 horas e meia (diferença de horários do servidores ftps) lTemVersaoNova := .t. endif endif */ else lErro := .t. visualiza("Problemas para verificar nova versão! ") if !lQuiet MsgInfo('Problemas para verificar nova versão!','Erro de Atualização') endif endif if !lErro .and. !lTemVersaoNova visualiza("Não Existe nova versão disponibilizada! ") if !lQuiet MsgInfo('Não Existe nova versão disponível!','Sem Atualização') endif endif if !lErro .and. lTemVersaoNova if MsgYesNo('Existe nova versão disponível do NomeDoSistema, deseja atualizar?','Nova Versão') lAtualiza := .t. endif endif if lAtualiza visualiza("Resetando conexões...! ") syswait(2) sysrefresh() killprocess(cSistema+".exe") MyWinExec('livecred '+if(lQuiet,'/quiet ','')+cSistema+' '+cPerfil) endif lSair:= .t. quit hb_gcAll() return nil /////////////////////////////////////////////////////// FUNCTION EnviaVersao() local aFR3, aArqs := {} local lErro := .f. local cArqLocal, cArqEXE, cExtensao, cPastaFR3, cPastaImagem cArqLocal := CurDrive()+':\'+Curdir()+'\'+cArquivo cPastaFR3 := 'p:\desenv\fr\' cArqEXE := CurDrive()+':\'+Curdir()+'\'+cSistema+'.EXE' cExtensao := lower( right( cSistema, 3 ) ) aFR3 := directory( cPastaFR3+'*.fr3' ) for x = 1 to len( aFR3 ) aadd( aArqs, cPastaFR3+aFR3[x,1] ) next if cExtensao <> 'zip' .and. cExtensao <> 'rar' fErase( cArqLocal ) aadd( aArqs, cArqEXE ) // ? hb_zipfile( cArqLocal, {'c:\cardPrinter\crdLandEraseFront.bmp'} ) hb_zipfile( cArqLocal, aArqs ) else cArqLocal := CurDrive()+':\'+Curdir()+'\'+cSistema endif if EnviaFtp( cArqlocal ) if !lQuiet MsgInfo('Ok! versão Enviada para o servidor WEB!','Ok') endif else if !lQuiet MsgStop('ERRO AO ENVIAR VERSÃO!','Erro') endif endif lSair:= .t. oDlg:end() hb_gcAll() RETURN NIL ////////////////////////////////////////////////// FUNCTION Atualiza() local aArquivos := {}, i local cArqLocal := CurDrive()+':\'+Curdir()+'\'+cArquivo local cPastaBak := sonumeros(dtoc(date()))+'_'+sonumeros(time()) local cExtensao local lErro := .f. // Apagando o arquivo existente Ferase( cArquivo ) Ferase( cArqLocal ) if RecebeFtp( cArqlocal, cArquivo ) visualiza("Executando Backup da Versão Atual...") // Criando um backup dos arquivos anteriores lmkdir(cLocal+'\fr') lmkdir(cLocal+'\Live') lmkdir(cLocal+'\Live\'+cPastaBak) aArquivos := ZipRead(cLocal+'\'+cArquivo) for i = 1 to len(aArquivos) cExtensao := lower( right( aArquivos, 3 ) ) if cExtensao <> 'fr3' .and. cExtensao <> 'gif' frename(cLocal+'\'+aArquivos,cLocal+'\Live\'+cPastaBak+'\'+aArquivos) endif next // Backup Criado visualiza("Descompactando a Versão Atual...") // Descompactando for i = 1 to len(aArquivos) // entrando em um loop caso o arquivo a ser descompactado esteja aberto do while .t. cExtensao := lower( right( aArquivos, 3 ) ) if cExtensao <> 'fr3' .and. cExtensao <> 'gif' .and. file(cLocal+'\'+aArquivos) .and. frename(cLocal+'\'+aArquivos, cLocal+'\Live\'+cPastaBak+'\'+aArquivos ) <> 0 if !lQuiet .and. MsgYesNo('Erro ao criar backup do Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado') loop else lErro := .t. exit endif endif if !hb_unzipfile( cLocal+'\'+cArquivo, {|cArq| qout(cArq) }, .t.,'', cLocal, aArquivos ) if !lQuiet .and. MsgYesNo('Erro ao DESCOMPACTAR o Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado') loop else lErro := .t. exit endif endif // Tratando os arquivos FR3 if cExtensao = 'fr3' .and. !copyfile(cLocal+'\'+aArquivos, cLocal+'\fr\'+aArquivos ) if !lQuiet .and. MsgYesNo('Erro ao DESCOMPACTAR o Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado') loop else lErro := .t. exit endif elseif cExtensao = 'gif' .and. !copyfile(cLocal+'\'+aArquivos, cLocal+'\imagem\'+aArquivos ) if !lQuiet .and. MsgYesNo('Erro ao DESCOMPACTAR o Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado') loop else lErro := .t. exit endif elseif cExtensao = 'fr3' .or. cExtensao = 'gif' ferase( cLocal+'\'+aArquivos ) endif exit enddo if lErro exit endif next if lErro visualiza("ERRO, houve um erro! - VERSÃO NÃO ATUALIZADA") visualiza("Restaurando a versão anterior...") for i = 1 to len(aArquivos) CopyFile(cLocal+'\Live\'+cPastaBak+'\'+aArquivos, cLocal+'\'+aArquivos) next else visualiza("OK! Versão atualizada e pronta para ser usada!") endif else lErro := .t. visualiza("ERRO ao Receber o Arquivo de Atualização! - VERSÃO NÃO ATUALIZADA") if !lQuiet MsgAlert('Falha na recepção do arquivo!','Erro') endif endif if !lerro if !lQuiet MsgInfo('Ok! versão Atualizada e pronta para ser usada!','Ok') else MyWinExec( cSistema ) endif endif RETURN NIL // Visualizar o que está sendo executado ///////////////////////////// Function Visualiza( cTexto ) ///////////////////////////// if !lQuiet if valtype(cTexto) <> 'O' cTxt += CRLF+cTexto endif oTxt:SetText( cTxt ) oTxt:SetPos(Len(cTxt)) oTxt:refresh() oDlg:Refresh() endif sysrefresh() Return Nil // Ler os nomes dos arquivos que estão dentro do ZIP * ----------------------------------------------------------------------------- Function zipread(zip_file) * ----------------------------------------------------------------------------- local _array := {} local zip := fopen(zip_file, 2), tmp :=space(4) local method, orig_date, fn_date, comp_size, uncomp local fn_size, extra, junk, file_name, orig_hora, fn_hora do while .t. tmp := space(4) if fread(zip, @tmp, 4) != 4 // End of file exit endif if tmp = "PK" + chr(1) + chr(2) // Central dir exit elseif tmp != "PK" + chr(3) + chr(4) exit endif tmp := space(26) fread(zip, @tmp, 26) method := bin2i(substr(tmp, 5, 2)) comp_size := bin2l(substr(tmp, 15, 4)) fn_size := bin2i(substr(tmp, 23, 2)) extra := bin2i(substr(tmp, 25, 2)) file_name := freadstr(zip, fn_size) junk := if(extra = 0, "", freadstr(zip, extra)) extract(zip, comp_size, method, file_name) aadd(_array, file_name ) enddo fclose(zip) return _array * ----------------------------------------------------------------------------- Static Function extract(_handle, _size, _method, unzip_file) * ----------------------------------------------------------------------------- local newfile, tmp := space(4096) if _method != 0 fseek(_handle, _size, 1) // Skip file else if newfile = fcreate(unzip_file, 0) do while _size > 0 fread(_handle, @tmp, len(tmp)) _size -= min(_size, 4096) fwrite(newfile, tmp) enddo fclose(newfile) endif endif return nil function SoNumeros( cString, cExcecao ) local cRetorno:='', x DEFAULT cExcecao:='' for x=1 to len( cString ) if substr( cString,x,1 )$'1234567890' .or. substr( cString,x,1 )$cExcecao cRetorno+=substr( cString,x,1 ) endif next return cRetorno ////////////////////////////DADOS DA FUNCAO////////////////////////////////// // NOME : MyWinExec /// // FINALIDADE : adequar WinExec ao windows 2000/nt /// // PARAMETROS : <1> cComando /// // RETORNO : nada /// ///////////////////////////////////////////////////////////////////////////// function MyWinExec( cComando ) local cExecute:='' if IsWinNT() // NT, 2000 e XP cExecute:=GetEnv( 'COMSPEC' )+' /C ' endif return WinExec( cExecute+cComando, 0 ) Function timefromstart return '00:00:00' KillProcess( "calc.exe" ) ///////////////////////////// FUNCTION KillProcess( cExe ) local oWmi, oList, oProc oWmi := WmiService() oList := oWmi:ExecQuery( "select * from Win32_Process where Name = '" + cExe + "'" ) for each oProc in oList oProc:Terminate() next return nil FUNCTION WMIService() // It would be useful to keep this function in the library static oWMI local oLocator if oWMI == nil oLocator := CREATEOBJECT( "wbemScripting.SwbemLocator" ) oWMI := oLocator:ConnectServer() endif return oWMI //////////////////////////////////////////////////////////////////////// FUNCTION RecebeFTP( cArqLocal, cArqRemoto ) //////////////////////////////////////////////////////////////////////// LOCAL lRetorno := .T. local i for i = 1 to 2 IF Conecta( i ) visualiza( "Conexão estabelecida, fazendo o Download..." ) oFtp:Cwd(cPasta) aArquivo := oFTP:listfiles( cArqRemoto ) if len( aArquivo ) = 0 lRetorno := .f. visualiza('Atualização não encontrada! **** ERRO **** ') lRetorno := .f. else lRetorno := Inicia_Progress(cArqLocal, aArquivo[1][2], cArqRemoto, oFtp ) endif oFTP:Close() else lRetorno := .f. endif if lRetorno exit endif next if lRetorno visualiza( "Arquivo Recebido com sucesso!" ) else visualiza( "Falha no Recebimento ***** ERRO *****" ) endif RETURN lRetorno ////////////////////////////////////////////////////// FUNCTION EnviaFtp( cFile ) ////////////////////////////////////////////////////// LOCAL lRetorno := .T. local i for i = 1 to 1 IF Conecta( i ) visualiza( "Conexão estabelecida, fazendo o Upload..." ) oFtp:Cwd(cPasta) if !oFtp:UploadFile( cFile ) lRetorno := .F. endif oFTP:Close() if lRetorno visualiza( "Arquivo enviado com sucesso!" ) else visualiza( "Falha no Envio!" ) endif ELSE lRetorno := .f. ENDIF next RETURN lRetorno ///////////////////////////////////////////////////////////////////// Function Inicia_Progress( cArquivoDestino, nTotal, cArqRemoto, oftp) ///////////////////////////////////////////////////////////////////// local lOk oFtp:exGauge := { | done, size| ShowGauge(done, size, nTotal, cArqRemoto ) } if !oFtp:DownLoadFile(cArquivoDestino) lOk := .f. else lOk := .t. endif return lOk // Mostrar a Barra de Progresso durante upload/download /////////////////////////////////////////////////// STATIC FUNCTION FtpProgress( nSent, nTotal, oFtp ) /////////////////////////////////////////////////// LOCAL cProgress cProgress := Int( 100*nSent/nTotal ) ometer:set(cProgress ) return .t. ///////////////////////////////////////////////////// Procedure ShowGauge( nSent, nSize, wTotal, ftpfile ) ///////////////////////////////////////////////////// if nSent > 0 cProgress := Int( (nSent/wTotal)*100 ) ometer:set(cProgress ) endif return /////////////////////////////// FUNCTION Conecta( nConexao ) /////////////////////////////// local cServer, cUsuario, cSenha, i local cUrl local oUrl local lRetorno := .f. default nConexao := 1 for i = nConexao to 2 if i = 1 cServer := 'ftp.declatecnologia.com.br' cUsuario := 'XXXXXXXXXXXXXXXXXXX' cSenha := 'YYYYYYYYYYY' elseif i = 2 cServer := 'ftp.declatecnologia.com.br' cUsuario := 'XXXXXXXXXXXXXXXXXXX' cSenha := 'YYYYYYYYYYY' endif If !IsDigit( cServer ) //O Servidor é um Nome WSAStartup() cServer := GetHostByName( cServer ) WSACleanUP() Endif cUrl := "ftp://" + cUsuario + ":" + cSenha + "@" + cServer visualiza( "Abrindo conexão com o "+str(i,1)+"o. Servidor..." ) oUrl := tUrl():New( cUrl ) oFTP := tIPClientFtp():New( oUrl ) oFTP:nConnTimeout := 20000 oFTP:bUsePasv := .T. // Forçar UserID se houver @ no usuário IF At( "@", cUsuario ) > 0 oFTP:oUrl:cServer := cServidor oFTP:oUrl:cUserID := cUsuario oFTP:oUrl:cPassword := cSenha ENDIF oFtp:exGauge := ( @FtpProgress() ) if oFTP:Open( cUrl ) lRetorno := .t. exit endif Visualiza('Não conectou ao Servidor!!!') if oFTP:SocketCon == NIL Visualiza('Conexão não inicializada!!!') elseif InetErrorCode( oFTP:SocketCon ) == 0 Visualiza('Resposta do Servidor: '+oFTP:cReply) else Visualiza('Erro na Conexão: '+InetErrorDesc( oFTP:SocketCon )) endif next RETURN lRetorno LiveCRED.res Quote Link to comment Share on other sites More sharing options...
edutraini Posted December 3, 2021 Author Report Share Posted December 3, 2021 Boa tarde, Alex To usando a sua rotina mas esta dando erro Vc poderia me ajudar ABraço Quote Link to comment Share on other sites More sharing options...
alex2002 Posted December 4, 2021 Report Share Posted December 4, 2021 21 horas atrás, edutraini disse: Boa tarde, Alex To usando a sua rotina mas esta dando erro Vc poderia me ajudar ABraço Olá Edu. Claro, vc tem o meu telefone. Pode me chamar novamente, já cheguei na cidade onde vou ficar até o dia 15/12 Só no horário comercial que é meio difícil, mas no mais estou a disposição. Um abraço, Alexandre Pereira CAMPEÃO BRASILEIRO Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.