Estoy trabajando con Adobe Flash ocx cargándolo en mi programa C++. Se supone que el ocx es de 64 bits, pero por alguna razón tiene problemas cuando compilo con la plataforma x64. He leído sobre esto y encontré que es probable que alguna función reciba DWORD userData
en lugar de void* userData
a través de alguna estructura y luego la arroje a un puntero de objeto. Esto funciona bien en un entorno de 32 bits, pero falla en 64 bits.MASM Fixing 64 bit Truncation en una DLL
El desmontaje de las llamadas de función dentro de la OCX que causan el accidente son las siguientes líneas:
mov ecx,r8d
las primeras copias operación sólo bajas de 32-bits de R8D
a ECX
(ECX es de 32 bits).
cmp dword ptr [rcx+11BCh],0
La segunda operación accesos registro de 64 bits, donde la baja de 32 bits de contiene la dirección correcta y altos de 32 bits contiene un poco de chatarra. Llevando a un choque, por supuesto.
Solución
He leído que una posible solución es hacer lo siguiente:
Crear un archivo asm que contiene el siguiente código:
nop nop nop mov ecx,r8d cmp dword ptr [rcx+11BCh],0 nop nop nop mov rcx,r8d // I've replaced ecx with rcx here cmp dword ptr [rcx+11BCh],0
Construya un archivo obj usando este archivo asm y MASM.exe
- Abrir el archivo obj con un editor hexadecimal y localizar los años 90 que representan la nop
- En Flash OCX localizar la primera cadena de bytes entre los NOP y sustituirla por la nueva cadena de bytes que se produce después de los NOP . Esto lo cambiará de llamadas de función de 32 bits a 64 bits.
Problema
que han intentado esto haciendo el siguiente archivo de ASM y la construcción con ml64.exe (no tengo MASM.EXE pero creo que es el nuevo ml.exe versión de 32 bits de la misma, y este código sólo se construiría con el ml64.exe, probablemente a causa de los 64 bits sólo los operadores):?
TITLE: Print String Assembly Program (test.asm)
.Code
main Proc
nop
nop
nop
mov ecx,r8d
cmp dword ptr [rcx+11BCh],0
nop
nop
nop
mov rcx,r8
cmp dword ptr [rcx+11BCh],0
main ENDP
END
tuve problemas para conseguir que se acumule (seguí recibiendo errores sobre coincidencia de longitud de instrucción) hasta que cambiado r8d a r8 en la segunda sección.
Obtuve este obj para compilarlo, lo abrí con un editor hexadecimal y pude localizar las dos cadenas de bytes. Pero donde surge mi problema es que cuando busco la primera cadena de bytes que debe estar en el flash ocx, no puedo encontrarla. No está allí, así que no puedo reemplazarlo con el segundo.
¿Qué estoy haciendo mal?
Gracias!
Puede ser la persona más inteligente en la comunidad Flash aquí. heh –
ha Ojalá ... De hecho, me gustaría saber más sobre el montaje y podría hacer que esto funcione. Estoy casi seguro de que sé cuál es el problema, ¡parece que no puede arreglarlo! –
¿Está diciendo que resolvió su problema editando manualmente el archivo Flash OCX? – Gabe