Gravando/Registrando DLLs pelo aplicativo

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gravando/Registrando DLLs pelo aplicativo

Mensagem por JoséQuintas »

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

Código: Selecionar todos

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: Selecionar todos

FUNCTION ShellExecuteRunAs( cFileName, cParameters, nShow )

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

   RETURN NIL

Código: Selecionar todos

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: Selecionar todos

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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gravando/Registrando DLLs pelo aplicativo

Mensagem por JoséQuintas »

Só faltou a de resource:

Código: Selecionar todos

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: Selecionar todos

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Gravando/Registrando DLLs pelo aplicativo

Mensagem por JoséQuintas »

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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder