Всем привет! Натолкнулся на грабли — ну жно сохранить QPixmap (Qt4) в базе данных как OLE объект.
В поиске нашел много подбного, но такого к сажелению не было
Если с загрузкой из базы проблем нет (просто пропускается OLE-заголовок), то с сохранением выходит сложнее. Вот я докопал до этого, на знаю правильно ли это.
QString textQuery = "INSERT INTO Employees (FirstName, LastName, Date_of_birth, Phone, Address, Photo) "
"VALUES (:FirstName, :LastName, :Date_of_birth, :Phone, :Address, :Photo)";
query.prepare(textQuery);
query.bindValue(":FirstName", firstName);
query.bindValue(":LastName", lastName);
query.bindValue(":Date_of_birth", dateBirth);
query.bindValue(":Phone", phone);
query.bindValue(":Address", address);
QPixmap *photo = photoLabel->pixmap();
if (photo && !photo->isNull()) {
PICTDESC describe;
describe.bmp.hbitmap = photo->toWinHBITMAP();
describe.bmp.hpal = QColormap::hPal();
describe.picType = PICTYPE_BITMAP;
describe.cbSizeofstruct = sizeof(PICTDESC);
LPPICTURE lpPicture = NULL;
HRESULT hr = OleCreatePictureIndirect(&describe, IID_IPicture, true, (void **) &lpPicture);
if(SUCCEEDED(hr) && (lpPicture != NULL)) {
// тут необходимо перевести IPicture (lpPicture) в QByteArray (dataPhoto)
query.bindValue(":Photo", dataPhoto);
.......
query.exec();
В общем надо из IPicture получить указатель на массив (OLE-рисунок) и его длину, чтоб затем запихнуть его в QByteArray.
20.01.10 20:25: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
Эк тебя заколбасило!

Открываем MSDN, и читаем про
IPicture:
...
The picture object also supports IPersistStream so it can save and load itself from an instance of IStream.
...
P.S. А почему именно OLE-объекты? Чем не устраивает родная Qt-шная сериализация?
Или эту базу из VB кто-то мучает?
Здравствуйте, Tonal-, Вы писали:
T>Эк тебя заколбасило!
T>Открываем MSDN, и читаем про IPicture:
T>T>...
T>The picture object also supports IPersistStream so it can save and load itself from an instance of IStream.
T>...
Ну вот сделал так — не работает. Записывает в буфер какую-то муть. Что я делаю не так?
PICTDESC describe;
memset(&describe, 0, sizeof(describe));
describe.cbSizeofstruct = sizeof(describe);
describe.bmp.hbitmap = photo->toWinHBITMAP();
describe.bmp.hpal = QColormap::hPal();
describe.picType = PICTYPE_BITMAP;
LPPICTURE pPicture = 0;
HRESULT hr = ::OleCreatePictureIndirect(&describe, IID_IPicture, true, (void **) &pPicture);
if(SUCCEEDED(hr) && (pPicture != NULL)) {
IStorage* pStg = 0;
hr = ::StgCreateDocfile(NULL, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &pStg);
if(SUCCEEDED(hr)) {
IStream* pStream = 0;
pStg->CreateStream(L"PICTURE", STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, 0, &pStream);
IPersistStream *pPersistStream;
if (SUCCEEDED(pPicture->QueryInterface(IID_IPersistStream, (void**)&pPersistStream))) {
pPersistStream->Save(pStream, false);
ULARGE_INTEGER pcbSize;
if(SUCCEEDED(pPersistStream->GetSizeMax(&pcbSize))) {
ULONG sizeData = pcbSize.QuadPart;
char *data = new char[sizeData];
HRESULT hr = pStream->Write(data, sizeData, &sizeData);
if (SUCCEEDED(hr)) {
QByteArray dataPhoto(data, sizeData);
query.bindValue(":Photo", dataPhoto);
}
T>P.S. А почему именно OLE-объекты? Чем не устраивает родная Qt-шная сериализация?
T>Или эту базу из VB кто-то мучает?
При открытии в Акцесе рисунки не отображаются, если сохранить просто как бинарные данные.
Может вмепсто
StgCreateDocfile + CreateStream просто
CreateStreamOnHGlobal?
P.S. А очень нужно именно в Ацесе открывать?
Здравствуйте, Tonal-, Вы писали:
T>Может вмепсто StgCreateDocfile + CreateStream просто CreateStreamOnHGlobal?
T>P.S. А очень нужно именно в Ацесе открывать?
Да, так и сделаю (без возможности отображения в Акцесе) , а то у меня начала уже крыша ехать от всех этих наворотов с интерфейсами

.