Postada em 28/08/2008 21:44 hs
Primeiro você deve embutir o arquivo OCX dentro do seu EXE, para isso você deve carregar o Editor de Resouce do seu Visual Basic 6 Enterprise Edition:
* Vá no menu "Add-Ins" -> "Add-In Manager...", quando a janela "Add-In Manager" aparecer selecione o item "VB 6 Resource Editor" e marque as duas primeiras checkboxes "Loadded/Unloaded" e "Load on Startup" do Quadro "Load Behavior" e clique em "OK". Isso irá adicionar um ícone com desenho verde na barra padrão do Visual Basic, esse ícone é o "Resource Editor".
Agora clique no ícone do "Resource Editor" ou Vá no menu "Tools" -> "Resource Editor", a janela "VB Resource Editor" aparecerá, então você deverá clicar no ícone "Add Custom Resource" para adicionar o OCX, é o penúltimo ícone da barra padrão antes do ícone "Ajuda", após adicionar seu arquivo irá criar uma pasta com nome "CUSTOM" a com a ID "101"
Recomendo você alterar a ID "101" para "MSINET.OCX" e o nome da pasta "CUSTOM" para "Biblioteca" ou "Library", isso depende da sua organização, para alterar esses nomes basta clicar duas vezes no seu arquivo binário que deverá estar com a ID "101", a janela de Propriedades "Edit Properties" irá aparecer.
Após feito a alteração você tem o nome da Pasta e a ID do MSINET.OCX em mãos. Agora vamos usar a função LoadResData para ter acesso à Resource e Extrair o arquivo:
Dim File() As Byte, lFile As Long lFile = FreeFile
File = LoadResData("MSINET.OCX", "LIBRARY")
Open "C:MSINET.OCX" For Binary Access Write As #lFile Put #lFile, 1, File Close #lFile
'***********************************************************************************************
Aqui vai a solução completa: ----------------------------
Option Explicit
Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Any, ByVal wParam As Any, ByVal lParam As Any) As Long
Private Declare Sub FatalAppExit Lib "kernel32" Alias "FatalAppExitA" (ByVal uAction As Long, ByVal lpMessageText As String) Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Const MAX_PATH As Long = 260
Sub Main() Call CheckLibrary
Form1.Show End Sub
Private Sub CheckLibrary() Dim sMsinet_ocx As String Dim sResID_Msinet_ocx As String Dim sResType_Msinet_ocx As String Dim sPathDest_Msinet_ocx As String
sMsinet_ocx = "MSINET.OCX" 'Nome do arquivo sResID_Msinet_ocx = "MSINET.OCX" 'Nome da ID no Resource sResType_Msinet_ocx = "LIBRARY" 'Nome da Pasta no Resource sPathDest_Msinet_ocx = GetSysDir & sMsinet_ocx 'Caminho de Destino
Dim bExtract As Boolean Dim bRet As Boolean
'Checa se o arquivo MSINET.OCX existe na pasta System do Windows If Dir$(sPathDest_Msinet_ocx, vbReadOnly Or vbHidden Or vbSystem) = Empty Then bExtract = Extract(sResID_Msinet_ocx, sResType_Msinet_ocx, sPathDest_Msinet_ocx) If Not bExtract Then FatalAppExit 0, "Ocorreu um erro fatal ao tentar acessar o Resource de " & App.EXEName & ".exe." 'Ou END Else bRet = DllRegisterServer(sMsinet_ocx) If Not bRet Then FatalAppExit 0, "Ocorreu um erro fatal ao tentar registrar o arquivo " & LCase(sMsinet_ocx) & "." 'Ou END End If End If Else 'Arquivo já existe End If End Sub
Private Function Extract(ResId As String, ResType As String, sPathDest As String) As Boolean On Error GoTo Trata_Erro
Dim File() As Byte, lFile As Long lFile = FreeFile
'Obtém Dados binários do arquivo a ser extraído do Resource File = LoadResData(ResId, ResType)
'Grava dados binário do arquivo no HD Open sPathDest For Binary Access Write As #lFile Put #lFile, 1, File Close #lFile
Extract = Not Extract Exit Function
Trata_Erro: End Function
Private Function DllRegisterServer(DllName As String) As Boolean Dim hLibrary As Long, hProcAdress As Long, Ret As Long hLibrary = LoadLibrary(DllName) If hLibrary <> 0 Then hProcAdress = GetProcAddress(hLibrary, "DllRegisterServer") 'DllUnRegisterServer para DesRegistrar If hProcAdress <> 0 Then Ret = _ CallWindowProc(hProcAdress, GetDesktopWindow, "", ByVal 0&, ByVal 0&)
DllRegisterServer = True Else 'Arquivo carregado porém o ponto de entrada não foi encontrado 'Arquivo não pode ser registrado End If Else 'Arquivo não encontrado End If
FreeLibrary hLibrary End Function
Private Function GetSysDir() As String Dim strFolder As String Dim lngResult As Long 'Obtém o caminho da Pasta System do Windows strFolder = String(MAX_PATH, 0) lngResult = GetSystemDirectory(strFolder, MAX_PATH) If lngResult <> 0 Then If Right(Left(strFolder, lngResult), 1) = Chr(92) Then GetSysDir = Left(strFolder, lngResult) Else GetSysDir = Left(strFolder, lngResult) & Chr(92) End If End If End Function
|