From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,eaa66222999bc09a X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news2.google.com!news4.google.com!newsfeed2.dallas1.level3.net!news.level3.com!bloom-beacon.mit.edu!news2.wam.umd.edu!nntp.abs.net!news.abs.net!not-for-mail Newsgroups: comp.lang.ada Subject: Re: WIA References: <1136285409.869370.95610@f14g2000cwb.googlegroups.com> From: Stephen Leake Message-ID: User-Agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (windows-nt) Cancel-Lock: sha1:uTAfAenpL/XPFW/WZ1Xr48pbCPI= MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Tue, 03 Jan 2006 06:36:44 -0500 NNTP-Posting-Host: 66.159.65.1 X-Complaints-To: abuse@toad.net X-Trace: news.abs.net 1136288206 66.159.65.1 (Tue, 03 Jan 2006 06:36:46 EST) NNTP-Posting-Date: Tue, 03 Jan 2006 06:36:46 EST Xref: g2news1.google.com comp.lang.ada:2425 Date: 2006-01-03T06:36:44-05:00 List-Id: "david" writes: > I'm trying to use wia in an ADA software. "Ada" is a woman's name, so it is not all caps. > 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 > ); I found this at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/stg/stg/ipropertystorage_writemultiple.asp > 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); This looks good; it matches http://msdn.microsoft.com/library/default.asp?url=/library/en-us/stg/stg/propspec.asp > type Tab_Propspec_Propid is array (Positive range <>) of Propspec > (Prspec_Propid); This doesn't match any C type; an Ada unconstrained array has the array bounds in the first few bytes. > 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); I'll assume this is right. > 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); Actually, this looks good. Although I would just declare the arguments to Writemultiple as System.Address, and avoid the calls to Unchecked_Conversion. That makes it clearer that you do _not_ have strong typing here. > 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. The hardest part about using Win32 is finding the bugs in the manual. I suspect you are using the data structures in a way that the function can't handle. If you can find a working example of this in C or C++, and translate that as closely as possible into Ada, you might get somewhere. > 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. You should ask about that on the gnavi mailing list; see http://sourceforge.net/projects/gnavi/ -- -- Stephe