comp.lang.ada
 help / color / mirror / Atom feed
From: "Frank J. Lhota" <NOSPAM.lhota@adarose.com>
Subject: Re: WIA
Date: Tue, 03 Jan 2006 14:04:30 GMT
Date: 2006-01-03T14:04:30+00:00	[thread overview]
Message-ID: <Ovvuf.5213$i%4.1027@trndny08> (raw)
In-Reply-To: <1136285409.869370.95610@f14g2000cwb.googlegroups.com>

david wrote:
> Hello,
> 
> I'm trying to use wia in an ADA software.
> 
> I have found little code samples to write com objects and this seems to
> work well.
> 
> My problem is to use  (Wia_Property_Storage_Interface.Lpvtbl.)
> Writemultiple : i'm not sure about interfacing the two types propspec
> and propvariant and the writemultiple call.
> In C, writemultiple is :
> 
> HRESULT WriteMultiple(
>   ULONG cpspec,
>   const PROPSPEC rgpspec[],
>   const PROPVARIANT rgpropvar[],
>   PROPID propidNameFirst
> );

Well, not quite. WriteMultiple is really a method for objects of type 
IPropertyStorage. If you're working in C++, then this is implemented as 
a C++ method. If you're working in C, then the first parameter is a 
pointer to the object, e.g.

  HRESULT __stdcall WriteMultiple(
    IPropertyStorage* This,
    ULONG cpspec,
    const PROPSPEC rgpspec[],
    const PROPVARIANT rgpropvar[],
    PROPID propidNameFirst
  );

Every call to IPropertyStorage::WriteMultiple needs to include the a 
pointer / reference to the object.


> I'm not sure about the ada corresponding specifications for the "const
> type var[]".
> I wrote :
> 
>    type Propspec (Kind : Win32.Ulong) is
>       record
>          case Kind is
>             when Prspec_Propid =>
>                Propid : Win32.Oleauto.Propid;
>             when Prspec_Lpwstr =>
>                Lpwstr : Win32.Objbase.Lpolestr;
>             when others =>
>                null;
>          end case;
>       end record;
>    pragma Convention (C, Propspec);
>    type Ppropspec is access all Propspec;
>    function To_Ppropspec is new Ada.Unchecked_Conversion
> (System.Address, Ppropspec);
> 
>    type Tab_Propspec_Propid is array (Positive range <>) of Propspec
> (Prspec_Propid);
> 
>       type Propvariant (Vt : Win32.Oleauto.Varenum) is
>       record
>          Wreserved1 : Win32.Word;
>          Wreserved2 : Win32.Word;
>          Wreserved3 : Win32.Word;
>          case Vt is
>             when Win32.Oleauto.Vt_I4 =>
>                Ival : Win32.Long;
>             when Win32.Oleauto.Vt_Bstr =>
>                Bstrval : Win32.Oleauto.Bstr;
>             when others =>
>                null;
>          end case;
>       end record;
>    pragma Convention (C, Propvariant);
>    type Ppropvariant is access all Propvariant;
>    function To_Ppropvar is new Ada.Unchecked_Conversion
> (System.Address, Ppropvariant);
> 
>    type Tab_Propvariant_Vt_I4 is array (Positive range <>) of
> Propvariant (Win32.Oleauto.Vt_I4);
> 
>    type Af_I_Wia_Property_Storage_Writemultiple is access
>      function (This      : access I_Wia_Property_Storage;
>                Cpspec    : Win32.Ulong; -- in
>                Rgpspec   : Ppropspec;-- in const propspec []
>                Rgpropvar : Ppropvariant;-- in const propvariant []
>                Propidnamefirst : Win32.Oleauto.Propid) -- in essayer
> avec 2
>        return Win32.Objbase.HRESULT;
>    pragma Convention (Stdcall,
> Af_I_Wia_Property_Storage_Writemultiple);
> 
> When calling this method, I write :
> 
> Propspec_Flash_Mode   : Tab_Propspec_Propid (1 .. 1) := (1 => (Kind =>
> Prspec_Propid,
> 
> Propid => Win32.Oleauto.Propid (Wia_Dpc_Flash_Mode)));
> Propvar_Flash_Fill   : Tab_Propvariant_Vt_I4 (1 .. 1) := (1 =>
> (Win32.Oleauto.Vt_I4,
> 
> Win32.Word (0),
> 
> Win32.Word (0),
> 
> Win32.Word (0),
> 
> Win32.Long (Wia_Flash_Mode_Fill)));
> 
> 
> My_Hresult := Wia_Property_Storage_Interface.Lpvtbl.Writemultiple
> (Wia_Property_Storage_Interface,
> 
>     1,
> 
>     To_Ppropspec (Propspec_Flash_Mode (1)'Address),
> 
>     To_Ppropvar (Propvar_Flash_Fill (1)'Address),
> 
>     2);
> 
> I tried to work without tab_prospec_propid and tab_propvariant_vt_i4
> but this doesn't work.
> When executing, my_hresult is s_false.
> 
> I tried to use gnatcom to verify my interfacing but createcom seems to
> not work on wiaservc.dll (whereas it works on wiaaut.dll for example.
> 
> So, I have 2 questions :
> 
> Is someone see a mistake on my interface code ?
> Does someone know why gnatcom doesn't work on wiaservc.dll ?
> 
> thank you very much and.....
> 
> best wishes for 2006
> 
> David
> 


-- 
"All things extant in this world,
Gods of Heaven, gods of Earth,
Let everything be as it should be;
Thus shall it be!"
- Magical chant from "Magical Shopping Arcade Abenobashi"

"Drizzle, Drazzle, Drozzle, Drome,
Time for the this one to come home!"
- Mr. Lizard from "Tutor Turtle"



  parent reply	other threads:[~2006-01-03 14:04 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-01-03 10:50 WIA david
2006-01-03 11:36 ` WIA Stephen Leake
2006-01-03 12:54   ` WIA david
2006-01-03 14:04 ` Frank J. Lhota [this message]
2006-01-03 14:22   ` WIA david
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox