segui el tutorial de elguille donde muestra como crear una dll estandar y todo me salio bien excepto que no se logra ejecutar el DllMain al cargar la dll, en algunos post decian que se tiene que cambiar el ep , ¿asi se soluciona el problema, como se hace eso?
Tu quieres hacer una DLL estandar y poner algo al ejecutar el DLLMain? O queres cargar una DLL y ejecutar su DllMain automaticamente?
Si es la primera, busca sobre vbadvance ( esta descontinuado ) y la segunda... supongo que con API's...
se supone que al cargar una dll se deberia ejecutar automaticamente la funcion DllMain como en las dll hechas en c y lo que quiero es eso precisamente ¿como lo hago?
Public Function DllMain(hInst As Long, fdwReason As Long,
lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
' No per-process cleanup needed
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH
' No per-thread initialization needed
Case DLL_THREAD_DETACH
' No per-thread cleanup needed
End Select
End Function
La Dll en VB no funciona...tiene que ser una en C/C++ :-[ :-[ :-[ :-[ :-[
De hecho si se puede :P
Classic VB Tools: vbAdvance (http://vb.mvps.org/tools/vbAdvance/)
si tu quieres hacer un Inyeccion Dll en VB. con una dll made for vb. no te va a funcionar por mas que el programa sea el notepad. pero si la dll esta en c/c++ si. espero no equivocarme !!! :huh:
Si se pueden hacer dll standard y si se pueden inyectar, lo dificil es hacer la libreria correctamente para no explotar el proceso inyectado.
gracias raul338 , probe ese programa vbAdvance y si me anda rebien, tan solo con cargar la dll se ejecuta automaticamente el dllmain y al descargarse se vuelve a ejecutar, lo probe con este codigo
la Dll:
Option Explicit
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" ( _
ByVal hwnd As Long, _
ByVal lpText As String, _
ByVal lpCaption As String, _
ByVal wType As Long) As Long
Public Function DllMain() As Long
DllMain = MessageBox(0, "hola", "titulo", 64)
DllMain = MessageBox(0, "hola", "titulo", 48)
DllMain = MessageBox(0, "hola", "titulo", 16)
End Function
el programa:
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Dim hModule As Long
Private Sub Command1_Click()
hModule = LoadLibrary("test.dll")
Me.Caption = hModule
End Sub
Private Sub Command2_Click()
Call FreeLibrary(hModule)
Me.Caption = ""
End Sub
Private Sub Form_Load()
Me.Caption = ""
End Sub
aunque si cierras el programa sin antes descargar la dll me sale un mensaje de error : la instruccion "xxxxxxx" hace referencia a la memoria "xxxxx" no se puede written , pero es un problema de lo mas minimo que lo solucione con FreeLibrary, gracias y saludos.
Cita de: Arconte en 19 Julio 2012, 05:18 AM
aunque si cierras el programa sin antes descargar la dll me sale un mensaje de error : la instruccion "xxxxxxx" hace referencia a la memoria "xxxxx" no se puede written , pero es un problema de lo mas minimo que lo solucione con FreeLibrary, gracias y saludos.
Y claro, es como manejar punteros, si terminas sin liberarlos tienes un problema de memoria :P solo que en este caso ni el sistema se encarga de liberarlo :xD