Pregunta

Tengo un archivo .mbm que copio en mi dispositivo usando esta línea en el archivo .pkg

"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"

Luego, en la función de dibujo de mi contenedor, hago esto ...

_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;

iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);

Sin embargo, la línea iBitmap- > Load (KMBMFile, 0); genera un KERN-EXEC: 0 PANIC

" Este pánico se produce cuando el núcleo no puede encontrar un objeto en el índice de objeto para el proceso actual o el hilo actual usando el número de índice de objeto especificado (el número de identificador sin procesar). "

¿Alguien puede ver dónde me equivoco?

¡Gracias!

¿Fue útil?

Solución

Estabas desreferiendo un puntero no inicializado, también puedes usar esto:

// remember to include the EIK environemnt include file
#include <eikenv.h>

_LIT(KMBMFile , "\\resource\\apps\\MyApp.mbm" );
CFbsBitmap* iBitmap;

iBitmap = iEikonEnv->CreateBitmapL( KMBMFile, 0 );
gc.BitBlt( Rect().iTl, iBitmap );

Otros consejos

He resuelto este problema, así que publicaré la respuesta aquí para futuros usuarios ...

Crea un archivo MBM en tu archivo MMP usando un fragmento de código como este

START BITMAP    MyApp.mbm
HEADER
TARGETPATH      \resource\apps
SOURCEPATH      ..\gfx
SOURCE          c24 background.bmp
END

asegúrese de que sus imágenes .bmp se guarden en 32 bits desde photoshop o similar

Luego, asegúrate de que tu archivo MBM se haya copiado en tu dispositivo en tu archivo PKG

"$(EPOCROOT)epoc32\data\z\resource\apps\MyApp.mbm" -"!:\resource\apps\MyApp.mbm"

Luego, en la función de dibujo de su contenedor, utilice un código como este ...

_LIT(KMBMFile , "C:\\RESOURCE\\APPS\\MyApp.mbm" );
CFbsBitmap* iBitmap = new (ELeave) CFbsBitmap;
TInt retval = iBitmap->Load(KMBMFile, 0);
gc.BitBlt(Rect().iTl, iBitmap);

Esto dibujará su mapa de bits en el punto superior izquierdo de la pantalla (útil para la imagen de fondo)

El código

CCoeControl :: Draw () no debe fallar, y ciertamente no debe irse (no tiene ningún rastro .. L ). En el fragmento de código anterior hay dos llamadas potencialmente generadoras de errores: iBitmap y iBitmap- > Load () . El mapa de bits debe asignarse previamente, no asignarse en Draw () ; si hay un error, sucederán cosas malas.

Además, por convención, solo las variables de miembros de clase comienzan con 'i', que iBitmap arriba no lo es.

Consulte Estándares de codificación de Symbian para obtener más detalles

Definitivamente no debes crear iBitmap en la función :: Draw, ya que podría irse. Mejor hacer eso en la construcción del CoeControl. Teóricamente, la llamada :: Load se podría manejar en :: Draw, ya que podría fallar por varias razones, y no todas pueden ser fatales. Sin embargo, puedes hacer esto con la misma facilidad al crear el Control, así que quizás sea mejor pensar un poco en ello. Yo diría que si el control está básicamente allí para contener el mapa de bits, entonces debería hacerlo en el ConstructL. Si hay varias cosas que hace el control, es posible que desee manejarlo en :: Draw.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top