¿Es posible cambiar el ClassName de un Form en VB6 o VB.NET2010?

Iniciado por okik, 10 Febrero 2015, 20:09 PM

0 Miembros y 1 Visitante están viendo este tema.

okik

Hola

LLevo infinidad de tiempo intentando encontrar la manera de cambiar el nombre de clase un formulario creado en VB6 o VB.NET. Pero no he encontrado la forma.

ClassName en VB6:
ThunderRT6FormDC fuera del entorno de programación
ThunderFormDC dentro del entorno de programación

ClassName en VB.NET
WindowsForms10.Window.8.app...

Sé que es posible establecer tu propio ClassName si creas el form desde cero mediante CreateWindowEx. Pero los usuarios de VB estamos mal acostumbrados y eso de tener que crear las cosas de forma "imaginaria" y que solo sean visibles cuando se ejecuten.... es un rollo. No hay ganas.

Lo curioso es que jamás me he encontrado ninguna aplicación, ni grande, ni pequeña, que tubiese el nombre de clase (ClassName) como ThunderRT6FormDC. Luego, ¿Nadie que se dedique profesionalmente  ha utilizado VB para crear sus apliaciones? o bien, ¿sí que es posible cambiarlo.?

A ver si algún gurú de la programación me lo sabe explicar.


Miseryk

Parece ser un tema complicado, no ví resultados en internet, pero hay que tener algo en cuenta, primero se registra una clase con "RegisterClassEx"

Código (cpp) [Seleccionar]

ATOM WINAPI RegisterClassEx(
  _In_  const WNDCLASSEX *lpwcx
);


Así que si la querés cambiar tenés que ir pensando en crear una a donde apuntar, ya que las clases son importantes porque los botones, textboxes son de tales características debido a su clase.

Luego podrías ver que hace internamente CreateWindow o CreateWindowEx, debe apuntar a un string o un puntero de la estructura ésa.

Ahora estoy un tanto ocupado haciendo funcionar "ZwQueryVirtualMemory", pero luego me pongo a debuggear CreateWindow y tratar de cambiar la clase, te conviene hacerlo en C++ y cuando lo logres lo pasás a VB6.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

okik

Lo he intentado #Miseryk# pero pasa que cuando se crea un form, no con el create windows, sino con el que proporciona VB6 por defecto, entonces éste ignora cualquier referencia al ClassName o cualquier intento de cambio, porque este form depende directamente del archivo msvbvm60.dll que se encuentra \system32.

El fomoso nombre de clase ThunderRT6FormDC que se establece en el viejo VB6, está establecido en el archivo msvbvm60.dll.

De modo que si se modifica el archivo con un editor hexadecimal, por ejemplo con Hex Editor al ejecutar cualquier apliación compilada con VB6, ésta tendrá el nombre de clase que se haya establecido en este archivo.

No se puede modificar el nombre  ThunderRT6FormDC en una sola línea, si no que se tiene que hacer por partes:

ThunderRT6 en:
73180  36 00 00 00 00 00 00 00 54 68 75 6e 64 65 72 52
73190  54 36 00 55 8b ec 56 8b 75 08 8b 46 28 f6 40 2a

Form en:
00fb10   46 6f 72 6d 00 00 00 00 4c 69 6e 65 00 00 00

DC en:   
28a90   DC  00 00 44 46 72 61 6d 65 00 00 00 00 00


Cuando la aplicación se ejecute en otro SO, con el archivo original msvbvm60.dll, entonces el nombre de clase de nuevo será  ThunderRT6FormDC.

Si el archivo ya modificado, está en la mísma carpeta del EXE creado con VB6 entonces, el nombre de clase será el establecido en el archivo que hemos modificado, independiéntemente que en \system32 esté el original. Porque el EXE recurre al archivo msvbvm60.dll inmediato del directorio y no lo busca en \system32.











Miseryk

Cita de: okik en 19 Marzo 2015, 11:38 AM
Lo he intentado #Miseryk# pero pasa que cuando se crea un form, no con el create windows, sino con el que proporciona VB6 por defecto, entonces éste ignora cualquier referencia al ClassName o cualquier intento de cambio, porque este form depende directamente del archivo msvbvm60.dll que se encuentra \system32.

El fomoso nombre de clase ThunderRT6FormDC que se establece en el viejo VB6, está establecido en el archivo msvbvm60.dll.

De modo que si se modifica el archivo con un editor hexadecimal, por ejemplo con Hex Editor al ejecutar cualquier apliación compilada con VB6, ésta tendrá el nombre de clase que se haya establecido en este archivo.

No se puede modificar el nombre  ThunderRT6FormDC en una sola línea, si no que se tiene que hacer por partes:

ThunderRT6 en:
73180  36 00 00 00 00 00 00 00 54 68 75 6e 64 65 72 52
73190  54 36 00 55 8b ec 56 8b 75 08 8b 46 28 f6 40 2a

Form en:
00fb10   46 6f 72 6d 00 00 00 00 4c 69 6e 65 00 00 00

DC en:   
28a90   DC  00 00 44 46 72 61 6d 65 00 00 00 00 00


Cuando la aplicación se ejecute en otro SO, con el archivo original msvbvm60.dll, entonces el nombre de clase de nuevo será  ThunderRT6FormDC.

Si el archivo ya modificado, está en la mísma carpeta del EXE creado con VB6 entonces, el nombre de clase será el establecido en el archivo que hemos modificado, independiéntemente que en \system32 esté el original. Porque el EXE recurre al archivo msvbvm60.dll inmediato del directorio y no lo busca en \system32.












Yo empezaría con un breakpoint en CreateWindow/CreateWindowEx y RegisterClass/RegisterClassEx, sí o sí tiene que caer por algunas de esas funciones.
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Miseryk

Lo ví así nomás, no me metí a debuguear mucho, el fin de semana me fijo mejor:

Código (asm) [Seleccionar]

(ole32.CoGetObjectContext+174)

7609649F   8BFF             MOV EDI,EDI
760964A1   55               PUSH EBP
760964A2   8BEC             MOV EBP,ESP
760964A4   83EC 2C          SUB ESP,2C
760964A7   A1 64641976      MOV EAX,DWORD PTR DS:[76196464]
760964AC   53               PUSH EBX
760964AD   56               PUSH ESI
760964AE   8B35 F8160576    MOV ESI,DWORD PTR DS:[<&USER32.RegisterClassW>]           ; USER32.RegisterClassW
760964B4   33DB             XOR EBX,EBX
760964B6   57               PUSH EDI
760964B7   8945 E4          MOV DWORD PTR SS:[EBP-1C],EAX
760964BA   8D45 D4          LEA EAX,DWORD PTR SS:[EBP-2C]
760964BD   BF B4630976      MOV EDI,ole32.760963B4                                    ; UNICODE "OleMainThreadWndClass"
760964C2   50               PUSH EAX
760964C3   895D FC          MOV DWORD PTR SS:[EBP-4],EBX
760964C6   895D D4          MOV DWORD PTR SS:[EBP-2C],EBX
760964C9   C745 D8 E5630976 MOV DWORD PTR SS:[EBP-28],ole32.760963E5
760964D0   895D DC          MOV DWORD PTR SS:[EBP-24],EBX
760964D3   C745 E0 0C000000 MOV DWORD PTR SS:[EBP-20],0C
760964DA   895D E8          MOV DWORD PTR SS:[EBP-18],EBX
760964DD   895D EC          MOV DWORD PTR SS:[EBP-14],EBX
760964E0   C745 F0 02000000 MOV DWORD PTR SS:[EBP-10],2
760964E7   895D F4          MOV DWORD PTR SS:[EBP-C],EBX
760964EA   897D F8          MOV DWORD PTR SS:[EBP-8],EDI
760964ED   FFD6             CALL ESI
760964EF   0FB7C0           MOVZX EAX,AX
760964F2   A3 CC641976      MOV DWORD PTR DS:[761964CC],EAX
760964F7   3BC3             CMP EAX,EBX
760964F9   0F84 9A1E0600    JE ole32.760F8399
760964FF   8B45 FC          MOV EAX,DWORD PTR SS:[EBP-4]
76096502   5F               POP EDI
76096503   5E               POP ESI
76096504   5B               POP EBX
76096505   C9               LEAVE
76096506   C3               RETN


(ole32.CoGetObjectContext+EA)
76096415   8BFF             MOV EDI,EDI
76096417   56               PUSH ESI
76096418   33F6             XOR ESI,ESI
7609641A   46               INC ESI
7609641B   E8 0C370000      CALL ole32.76099B2C
76096420   85C0             TEST EAX,EAX
76096422   75 45            JNZ SHORT ole32.76096469
76096424   50               PUSH EAX
76096425   FF35 64641976    PUSH DWORD PTR DS:[76196464]                                                       ; ole32.76050000
7609642B   50               PUSH EAX
7609642C   6A FD            PUSH -3
7609642E   B8 00000080      MOV EAX,80000000
76096433   50               PUSH EAX
76096434   50               PUSH EAX
76096435   50               PUSH EAX
76096436   50               PUSH EAX
76096437   68 00000088      PUSH 88000000
7609643C   68 70640976      PUSH ole32.76096470                                                                ; UNICODE "OleMainThreadWndName"
76096441   FF35 CC641976    PUSH DWORD PTR DS:[761964CC]
76096447   6A 00            PUSH 0
76096449   FF15 1C170576    CALL DWORD PTR DS:[<&USER32.CreateWindowExW>]                                      ; USER32.CreateWindowExW
7609644F   A3 74651976      MOV DWORD PTR DS:[76196574],EAX
76096454   85C0             TEST EAX,EAX
76096456   0F84 E71E0600    JE ole32.760F8343
7609645C   FF15 98140576    CALL DWORD PTR DS:[<&API-MS-Win-Core-ProcessThreads-L1-1-0.GetCurrentThreadId>]    ; kernel32.GetCurrentThreadId
76096462   A3 E0641976      MOV DWORD PTR DS:[761964E0],EAX
76096467   33F6             XOR ESI,ESI
76096469   8BC6             MOV EAX,ESI
7609646B   5E               POP ESI
7609646C   C3               RETN


(MSVBVM60.ThunRTMain+125E)
72944802   8B45 1C          MOV EAX,DWORD PTR SS:[EBP+1C]
72944805   8365 E0 00       AND DWORD PTR SS:[EBP-20],0
72944809   8945 D8          MOV DWORD PTR SS:[EBP-28],EAX
7294480C   8B45 0C          MOV EAX,DWORD PTR SS:[EBP+C]
7294480F   8945 DC          MOV DWORD PTR SS:[EBP-24],EAX
72944812   8B45 20          MOV EAX,DWORD PTR SS:[EBP+20]
72944815   8945 E4          MOV DWORD PTR SS:[EBP-1C],EAX
72944818   A1 D4E7A472      MOV EAX,DWORD PTR DS:[72A4E7D4]
7294481D   8945 E8          MOV DWORD PTR SS:[EBP-18],EAX
72944820   8B45 10          MOV EAX,DWORD PTR SS:[EBP+10]
72944823   8945 EC          MOV DWORD PTR SS:[EBP-14],EAX
72944826   8B45 14          MOV EAX,DWORD PTR SS:[EBP+14]
72944829   8365 F8 00       AND DWORD PTR SS:[EBP-8],0
7294482D   8945 F0          MOV DWORD PTR SS:[EBP-10],EAX
72944830   8B45 18          MOV EAX,DWORD PTR SS:[EBP+18]
72944833   8975 FC          MOV DWORD PTR SS:[EBP-4],ESI
72944836   8945 F4          MOV DWORD PTR SS:[EBP-C],EAX
72944839   8D45 D8          LEA EAX,DWORD PTR SS:[EBP-28]
7294483C   50               PUSH EAX
7294483D   FF15 A4139472    CALL DWORD PTR DS:[<&USER32.RegisterClassA>]                                       ; USER32.RegisterClassA
72944843   66:F7D8          NEG AX


(MSVBVM60.ThunRTMain+74B)
72943CEF   53               PUSH EBX
72943CF0   53               PUSH EBX
72943CF1   53               PUSH EBX
72943CF2   53               PUSH EBX
72943CF3   53               PUSH EBX
72943CF4   68 D3789472      PUSH MSVBVM60.729478D3
72943CF9   68 F0989572      PUSH MSVBVM60.729598F0                                                             ; ASCII "VBFocusRT6"
72943CFE   E8 DC0A0000      CALL MSVBVM60.729447DF
72943D03   85C0             TEST EAX,EAX
72943D05   0F84 468F0100    JE MSVBVM60.7295CC51
72943D0B   391D E8E7A472    CMP DWORD PTR DS:[72A4E7E8],EBX
72943D11   0F84 2A8F0100    JE MSVBVM60.7295CC41
72943D17   6A 19            PUSH 19
72943D19   58               POP EAX
72943D1A   53               PUSH EBX
72943D1B   68 00080000      PUSH 800
72943D20   50               PUSH EAX
72943D21   53               PUSH EBX
72943D22   53               PUSH EBX
72943D23   68 29109772      PUSH MSVBVM60.72971029
72943D28   68 E0989572      PUSH MSVBVM60.729598E0                                                             ; ASCII "VBBubbleRT6"
72943D2D   E8 AD0A0000      CALL MSVBVM60.729447DF
72943D32   85C0             TEST EAX,EAX
72943D34   0F84 178F0100    JE MSVBVM60.7295CC51
72943D3A   A1 A8E8A472      MOV EAX,DWORD PTR DS:[72A4E8A8]
72943D3F   8B0D D8E7A472    MOV ECX,DWORD PTR DS:[72A4E7D8]                                                    ; LEN.00400000


(MSVBVM60.ThunRTMain+2947)
72945EEB   55               PUSH EBP
72945EEC   8BEC             MOV EBP,ESP
72945EEE   83EC 34          SUB ESP,34
72945EF1   53               PUSH EBX
72945EF2   56               PUSH ESI
72945EF3   57               PUSH EDI
72945EF4   68 98E4A472      PUSH MSVBVM60.72A4E498
72945EF9   8D4D FC          LEA ECX,DWORD PTR SS:[EBP-4]
72945EFC   E8 53D6FFFF      CALL MSVBVM60.72943554
72945F01   8D45 CC          LEA EAX,DWORD PTR SS:[EBP-34]
72945F04   BB 08A29572      MOV EBX,MSVBVM60.7295A208                                                          ; ASCII "ThunderRT6Main"
72945F09   50               PUSH EAX
72945F0A   53               PUSH EBX
72945F0B   FF35 D4E7A472    PUSH DWORD PTR DS:[72A4E7D4]                                                       ; MSVBVM60.#1374
72945F11   FF15 F8129472    CALL DWORD PTR DS:[<&USER32.GetClassInfoExA>]                                      ; USER32.GetClassInfoExA
72945F17   33F6             XOR ESI,ESI
72945F19   85C0             TEST EAX,EAX
72945F1B   75 71            JNZ SHORT MSVBVM60.72945F8E
72945F1D   6A 0C            PUSH 0C
72945F1F   8D7D CC          LEA EDI,DWORD PTR SS:[EBP-34]
72945F22   59               POP ECX
72945F23   6A 01            PUSH 1
72945F25   FF35 D8E7A472    PUSH DWORD PTR DS:[72A4E7D8]                                                       ; LEN.00400000
72945F2B   F3:AB            REP STOS DWORD PTR ES:[EDI]
72945F2D   A1 D4E7A472      MOV EAX,DWORD PTR DS:[72A4E7D4]
72945F32   C745 D4 25619472 MOV DWORD PTR SS:[EBP-2C],MSVBVM60.72946125
72945F39   8945 E0          MOV DWORD PTR SS:[EBP-20],EAX
72945F3C   895D F4          MOV DWORD PTR SS:[EBP-C],EBX
72945F3F   FF15 FC129472    CALL DWORD PTR DS:[<&USER32.LoadIconA>]                                            ; USER32.LoadIconA
72945F45   3935 E8E7A472    CMP DWORD PTR DS:[72A4E7E8],ESI
72945F4B   8945 E4          MOV DWORD PTR SS:[EBP-1C],EAX
72945F4E   74 24            JE SHORT MSVBVM60.72945F74
72945F50   56               PUSH ESI
72945F51   6A 32            PUSH 32
72945F53   E8 C4000000      CALL MSVBVM60.7294601C
72945F58   50               PUSH EAX
72945F59   6A 31            PUSH 31
72945F5B   E8 BC000000      CALL MSVBVM60.7294601C
72945F60   50               PUSH EAX
72945F61   6A 01            PUSH 1
72945F63   6A 01            PUSH 1
72945F65   FF35 D8E7A472    PUSH DWORD PTR DS:[72A4E7D8]                                                       ; LEN.00400000
72945F6B   FF15 00139472    CALL DWORD PTR DS:[<&USER32.LoadImageA>]                                           ; USER32.LoadImageA
72945F71   8945 F8          MOV DWORD PTR SS:[EBP-8],EAX
72945F74   8D45 CC          LEA EAX,DWORD PTR SS:[EBP-34]
72945F77   C745 CC 30000000 MOV DWORD PTR SS:[EBP-34],30
72945F7E   50               PUSH EAX
72945F7F   FF15 04139472    CALL DWORD PTR DS:[<&USER32.RegisterClassExA>]                                     ; USER32.RegisterClassExA
72945F85   66:85C0          TEST AX,AX
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

Miseryk

#5
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

okik

Lo que pasa es que CreateWindow/CreateWindowEx y RegisterClass/RegisterClassEx crean un formulario desde 0 y no tiene dependencia con msvbvm60.dll y en cualquier caso con User32.dll, que siempre está disponible en windows.

Por ahora, voy ha dejar el tema y la programación durante un tiempo para centrarme en otras cosas. Pero gracias de todos modos.  :D