На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> COM объекты - перевод СИшного кода на Паскаль
    Приветствую. Давно не брался за программирование, нужда заставила. Да вот только код, с которым я работаю, только СИшный. Не могу понять как на Паскалевский синтаксис перевести некоторые моменты. Пишу вобще в Лазарусе...
    Итак, есть интерфейсы IImagingFactory и IImage. Все они наследуются от интерфейса IUnknown.

    Заранее напишу что GUID правильные.
    ExpandedWrap disabled
      const
        CLSID_ImagingFactory: TGUID = '{327ABDA8-072B-11D3-9D7B-0000F81EF32E}';
        IID_IImagingFactory : TGUID = '{327ABDA7-072B-11D3-9D7B-0000F81EF32E}';


    В интерфейсе IImage есть функция
    ExpandedWrap disabled
      HRESULT Draw(HDC hdc, const RECT* dstRect, OPTIONAL const RECT* srcRect);


    На наш Паскалевский синтаксис я перевел ее так
    ExpandedWrap disabled
      type
        IImage = interface(IUnknown)
          ['{327ABDA9-072B-11D3-9D7B-0000F81EF32E}']
          function Draw(const hdcIn: HDC; dstRect, srcRect: PRect): HRESULT; safecall;
        end;


    Ну соответсвенно добавил еще типы раз на СИшном коде вижу указатели на интерфейсы. Думаю пускай будет, все равно дальше по ходу пьессы они добавятся...
    ExpandedWrap disabled
      type
        PIImage = ^IImage;
      type
        PIImagingFactory = ^IImagingFactory;


    А в интерфейсе IImagingFactory есть функция
    ExpandedWrap disabled
      HRESULT CreateImageFromFile(const WCHAR* filename, IImage** image);


    По аналогии я перевел ее так
    ExpandedWrap disabled
      type
        IImagingFactory = interface(IUnknown)
          ['{327ABDA7-072B-11D3-9D7B-0000F81EF32E}']
          function CreateImageFromFile(const filename: LPWSTR; out image: PIImage): HRESULT; safecall;
        end;


    Ну и собственно сам код
    ExpandedWrap disabled
      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? Смотрел исходники чтобы по аналогии сделать, вобще запутался. Заранее спасибо.
      Цитата Maksim V. @
      function Draw(const hdcIn: HDC; dstRect, srcRect: PRect): HRESULT; safecall;

      так:
      ExpandedWrap disabled
        function Draw(const hdcIn: HDC; dstRect, srcRect: PRect): HRESULT; stdcall;

      или так:
      ExpandedWrap disabled
        procedure Draw(const hdcIn: HDC; dstRect, srcRect: PRect); safecall;

      или даже:
      ExpandedWrap disabled
        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;

      так:
      ExpandedWrap disabled
        function CreateImageFromFile(const filename: LPWSTR; out image: IImage): HRESULT; stdcall;

      или так:
      ExpandedWrap disabled
        function CreateImageFromFile(const filename: LPWSTR): IImage; safecall;
      Сообщение отредактировано: Shaggy -
      Что бы ни происходило, убедись, что ты чист. Обращай внимание на следы, результаты дают только чистые операции. Ощутив необходимость, проконтролируй себя и раз, и два. Будь чист, пусть это станет законом.
        Хорошо, вот тогда допустим оставляю так out image: IImage

        ExpandedWrap disabled
          function CreateImageFromFile(const filename: LPWSTR; out image: IImage): HRESULT; safecall;


        Код переделал так

        ExpandedWrap disabled
          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 это указатель или как?

        ExpandedWrap disabled
              STDMETHOD(CreateImageFromFile)(
                  IN const WCHAR* filename,
                  OUT IImage** image
                  ) = 0;


        Вот ссылка про этот метод на MSDN. Там написано [out] A pointer to the resulting IImage interface pointer. Это что за указатель на указатель такой? Значит нужен все таки PIImage в CreateImageFromFile? Я что-то запутался...
        Сообщение отредактировано: Maksim V. -
          HRESULT и stdcall!
          +
          в delphi интерфейс это уже указатель
          Сообщение отредактировано: Shaggy -
          Что бы ни происходило, убедись, что ты чист. Обращай внимание на следы, результаты дают только чистые операции. Ощутив необходимость, проконтролируй себя и раз, и два. Будь чист, пусть это станет законом.
            Shaggy
            Значит код у меня впринципе должен быть рабочий? Я даже сравнить не могу, кода на паскалевском синтаксисе этого нигде нет, тут все наугад как-то. QueryInterface впринципе отрабатывает, но валится на CreateImageFromFile. Такое может быть, что я не до конца указал все методы интерфейса, а только один?
              Цитата Maksim V. @
              Такое может быть, что я не до конца указал все методы интерфейса, а только один?

              Да, конечно!
              Что бы ни происходило, убедись, что ты чист. Обращай внимание на следы, результаты дают только чистые операции. Ощутив необходимость, проконтролируй себя и раз, и два. Будь чист, пусть это станет законом.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,1199 ]   [ 18 queries used ]   [ Generated: 20.07.19, 05:21 GMT ]