He hecho una prueba para intentar ver que pasa:
Código PHP:
unsigned int DataHandle;
HPALETTE APalette;
unsigned short MyFormat;
TPicture *pic;
IPictureDisp *pIPD;
//Obtengo el puntero al IPictureDisp
pIPD = (IPictureDisp*)AddFlow1->ExportPicture(afAllItems, true, true);
try
{
pic = new TPicture; //Solicito memoria para el TPicture
__try
{
try
{
//Prueba que deberia pasar la imagen al IPictureDisp
pic->LoadFromFile("Diagramas.wmf"); //Leo una imagen desde un archivo
GetOlePicture(pic, pIPD); //La paso del TPicture al IPictureDisp
SetOlePicture(pic, pIPD); //La paso del IPictureDisp al TPicture
//Envio la imagen al portapapeles
pic->SaveToClipboardFormat(MyFormat,DataHandle,APalette);
Clipboard()->SetAsHandle(MyFormat,DataHandle);
}catch(...){
ShowMessage("Fallo al copiar la imagen al portapapeles.");
}
}__finally{
delete pic; //Libero la memoria del TPicture
}
}catch(...){
ShowMessage("No hay memoria suficiente.");
}
Lo que hago es leer una imagen desde el TPicture, luego la paso al IPictureDispatch y luego la vuelvo a pasar al TPicture desde el IPictureDisp. Pues bien:
1- Al IPictureDisp le tengo que hacer un cast mas que extraño al asignarlo para que no de error despues.
2- Tanto GetOlePicture como GetOlePicture devuelven void por lo que no se si fallan pero no dan excepcion ninguna.
3- Cuando uso GetOlePicture no veo que nada cambie en el IPictureDisp.
4- Cuando uso SetOlePicture puedo ver como cambia el valor de FGrafic en su interior.
¿como puede ser que solo con copiar la imagen de uno a otro y luego otra vez volver a hacer lo mismo ya no sea capaz de leer la imagen? Creo que GetOlePicture no hace lo que debe o que IPictureDisp no se inicializa como debe. ¿Alguien puede ayudarme?