Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.12.240] |
|
Сообщ.
#1
,
|
|
|
Приветствую. Давно не брался за программирование, нужда заставила. Да вот только код, с которым я работаю, только СИшный. Не могу понять как на Паскалевский синтаксис перевести некоторые моменты. Пишу вобще в Лазарусе...
Итак, есть интерфейсы IImagingFactory и IImage. Все они наследуются от интерфейса IUnknown. Заранее напишу что GUID правильные. const CLSID_ImagingFactory: TGUID = '{327ABDA8-072B-11D3-9D7B-0000F81EF32E}'; IID_IImagingFactory : TGUID = '{327ABDA7-072B-11D3-9D7B-0000F81EF32E}'; В интерфейсе IImage есть функция HRESULT Draw(HDC hdc, const RECT* dstRect, OPTIONAL const RECT* srcRect); На наш Паскалевский синтаксис я перевел ее так type IImage = interface(IUnknown) ['{327ABDA9-072B-11D3-9D7B-0000F81EF32E}'] function Draw(const hdcIn: HDC; dstRect, srcRect: PRect): HRESULT; safecall; end; Ну соответсвенно добавил еще типы раз на СИшном коде вижу указатели на интерфейсы. Думаю пускай будет, все равно дальше по ходу пьессы они добавятся... type PIImage = ^IImage; type PIImagingFactory = ^IImagingFactory; А в интерфейсе IImagingFactory есть функция HRESULT CreateImageFromFile(const WCHAR* filename, IImage** image); По аналогии я перевел ее так type IImagingFactory = interface(IUnknown) ['{327ABDA7-072B-11D3-9D7B-0000F81EF32E}'] function CreateImageFromFile(const filename: LPWSTR; out image: PIImage): HRESULT; safecall; end; Ну и собственно сам код const FilePath: LPWSTR = '\StaticStore\test.bmp'; var hr : HRESULT; pFactory: IImagingFactory; I : IImage; pI : PIImage; begin hr := CoInitializeEx(nil, COINIT_MULTITHREADED); if (hr = S_OK) then try hr := CoCreateInstance(CLSID_ImagingFactory, nil, CLSCTX_INPROC_SERVER, IID_IImagingFactory, pFactory); if (hr = S_OK) then try hr := pFactory.QueryInterface(IID_IImagingFactory, pI); if (hr = S_OK) then try try hr := pFactory.CreateImageFromFile(FilePath, pI); if (hr = S_OK) then MessageBoxW(0, 'CreateImageFromFile', nil, MB_OK) except MessageBoxW(0, 'Except', nil, MB_OK); end; finally pI := nil; end; finally pFactory := nil; end; finally CoUninitialize; end; end. Ну и собственно вопросы. Правильно ли я на наш синтаксис перевел переменные функций? Что-то приложение валится с исключением после CreateImageFromFile. Может вобще такого метода нет? Но вроде QueryInterface дает добро. В отладке все равно дуб дубом поэтому даже не знаю куда и чего там глядеть. Надо ли использовать stdcall вместо safecall? Смотрел исходники чтобы по аналогии сделать, вобще запутался. Заранее спасибо. |
Сообщ.
#2
,
|
|
|
Цитата Maksim V. @ function Draw(const hdcIn: HDC; dstRect, srcRect: PRect): HRESULT; safecall; так: function Draw(const hdcIn: HDC; dstRect, srcRect: PRect): HRESULT; stdcall; или так: procedure Draw(const hdcIn: HDC; dstRect, srcRect: PRect); safecall; или даже: procedure Draw(const hdcIn: HDC; const [ref] dstRect:TRect;const srcRect: PRect = nil); safecall; // если компилятор ругается, [ref] можно убрать и Цитата Maksim V. @ function CreateImageFromFile(const filename: LPWSTR; out image: PIImage): HRESULT; safecall; так: function CreateImageFromFile(const filename: LPWSTR; out image: IImage): HRESULT; stdcall; или так: function CreateImageFromFile(const filename: LPWSTR): IImage; safecall; |
Сообщ.
#3
,
|
|
|
Хорошо, вот тогда допустим оставляю так out image: IImage
function CreateImageFromFile(const filename: LPWSTR; out image: IImage): HRESULT; safecall; Код переделал так const FilePath: LPWSTR = '\StaticStore\test.bmp'; var hr : HRESULT; pFactory: IImagingFactory; pImage : IImage; begin hr := CoInitializeEx(nil, COINIT_MULTITHREADED); if (hr = S_OK) then try hr := CoCreateInstance(CLSID_ImagingFactory, nil, CLSCTX_INPROC_SERVER, IID_IImagingFactory, pFactory); if (hr = S_OK) then try hr := pFactory.QueryInterface(IID_IImagingFactory, pImage); if (hr = S_OK) then try try hr := pFactory.CreateImageFromFile(FilePath, pImage); if (hr = S_OK) then MessageBoxW(0, 'OK', nil, MB_OK); except MessageBoxW(0, 'Except', nil, MB_OK); end; finally pImage := nil; end; finally pFactory := nil; end; finally CoUninitialize; end; end. Все равно валится в исключение. Мне в CreateImageFromFile совать pImage как IImage или PIImage? В оригинальном файле imaging.h здесь же IImage это указатель или как? STDMETHOD(CreateImageFromFile)( IN const WCHAR* filename, OUT IImage** image ) = 0; Вот ссылка про этот метод на MSDN. Там написано [out] A pointer to the resulting IImage interface pointer. Это что за указатель на указатель такой? Значит нужен все таки PIImage в CreateImageFromFile? Я что-то запутался... |
Сообщ.
#4
,
|
|
|
HRESULT и stdcall!
+ в delphi интерфейс это уже указатель |
Сообщ.
#5
,
|
|
|
Shaggy
Значит код у меня впринципе должен быть рабочий? Я даже сравнить не могу, кода на паскалевском синтаксисе этого нигде нет, тут все наугад как-то. QueryInterface впринципе отрабатывает, но валится на CreateImageFromFile. Такое может быть, что я не до конца указал все методы интерфейса, а только один? |
Сообщ.
#6
,
|
|
|
Цитата Maksim V. @ Такое может быть, что я не до конца указал все методы интерфейса, а только один? Да, конечно! |