Clipper On Line • Ver Tópico - Gravando/Registrando DLLs pelo aplicativo
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

Gravando/Registrando DLLs pelo aplicativo

26 Jun 2020 01:26

Resolvi assim.
11MB pra imagem... mais 4MB pra componentes não é problema.

Código:
PROCEDURE PSETUPCapicom

   ShellExecuteRunAs( hb_ProgName(), "/capicom" )

   RETURN

FUNCTION InstalaCapicom()

   LOCAL cPath := "c:\windows\system32\"

   IF Len( Directory( "c:\windows\syswow64\*.*" ) ) != 0
      cPath := "c:\windows\syswow64\"
   ENDIF
   hb_MemoWrit( cPath + "capicom.dll", ze_RawImage( "CAPICOM.DLL" ) )
   hb_MemoWrit( cPath + "msxml5.dll",  ze_RawImage( "MSXML5.DLL" ) )
   hb_MemoWrit( cPath + "msxml5r.dll", ze_RawImage( "MSXML5R.DLL" ) )
   RUN ( cPath + "regsvr32.exe " + cPath + "capicom.dll" )
   RUN ( cPath + "regsvr32.exe " + cPath + "msxml5.dll" )

   RETURN NIL


Código:
FUNCTION ShellExecuteRunAs( cFileName, cParameters, nShow )

   wapi_ShellExecute( NIL, "RunAs", cFileName, cParameters,, hb_DefaultValue( nShow, WIN_SW_SHOWNORMAL ) )

   RETURN NIL


Código:
PROCEDURE Main

   PARAMETERS cParam
   LOCAL xParam, nThreads := 2, cPath, oExeList

   Set( _SET_CODEPAGE, "PTISO" )
   cPath := hb_FNameDir( hb_ProgName() )
   IF cParam != NIL
      IF "/capicom" $ cParam
         InstalaCapicom()
         QUIT
      ENDIF
   ENDIF


Código:
25/06/2020  18:02         3.181.437 ze_resource.o
25/06/2020  18:02        11.119.650 jpa.reso
25/06/2020  18:02         6.544.816 jpa.exe


autoriza.jpg

Gravando/Registrando DLLs pelo aplicativo

06 Jul 2020 19:16

Só faltou a de resource:

Código:
FUNCTION ze_RawImage( cImage, lObrigatorio )

   hb_Default( @lObrigatorio, .F. )
   IF ! lObrigatorio
      hb_Default( @cImage, AppEmpresaApelido() )
   ENDIF
   IF ValType( cImage ) == "C"
      cImage := Upper( cImage )
   ENDIF
   DO CASE
   CASE cImage == "CAPICOM.DLL"                                 ; #pragma __binarystreaminclude "resource\capicom.dll"     | RETURN %s
   CASE cImage == "MSXML5.DLL"                                  ; #pragma __binarystreaminclude "resource\msxml5.dll"      | RETURN %s
   CASE cImage == "MSXML5R.DLL"                                 ; #pragma __binarystreaminclude "resource\msxml5r.dll"     | RETURN %s
   CASE cImage == "RMCHART.DLL"                                 ; #pragma __binarystreaminclude "resource\rmchart.dll"     | RETURN %s
   CASE File( "logotipo.jpg" ) .AND. ! lObrigatorio ; RETURN MemoRead( "logotipo.jpg" )
   ENDCASE

   RETURN NIL


Nota:
Aonde aceita diretamente o formato raw, pego daí, o fonte retorna o conteúdo do arquivo.
Em outros casos, uso o resource normal.

Repetindo o post anterior, mas chamando atenção aos detalhes:
Código:
25/06/2020  18:02         3.181.437 ze_resource.o
25/06/2020  18:02        11.119.650 jpa.reso
25/06/2020  18:02         6.544.816 jpa.exe


o ze_resource é o fonte acima, compilado (tem mais coisas além do que postei).
o jpa.reso é o arquivo RC, resource normal com ícones e manifest, compilado
Um não tem nada a ver com o outro.
e o EXE é só pra dar uma idéia do tamanho final.

Gravando/Registrando DLLs pelo aplicativo

07 Jul 2020 11:14

E faltou uma explicação adicional:

O aplicativo roda sempre igual ao usuário.

Ao chamar a rotina de setup, ele usa a opção "RunAs", pra rodar como administrador, e chama a si próprio passando /capicom
Na chamada, ao detectar /capicom, ele instala e registra.
NÃO precisa nada adicional, porque certamente ele está rodando como administrador e pode fazer isso.

Importante:

- NÃO sei se funciona pra fazer o mesmo com OCX
- Antivírus alerta como VIRUS, se um EXE precisar direitos de administrador e não for ASSINADO, por isso é importante o manifest com direitos limitados.
E sem manifest, acaba sendo considerado como administrador também, então não tem jeito, é colocar manifest limitando direitos.
Postar uma resposta