Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [OSX] Did anybody use USBLib with C++?



Hi,

I did try to keep as much as possible inside C++, adding a special place for
plain C workarounds. And so far

err = 
(*iodev)->QueryInterface(iodev,  CFUUIDGetUUIDBytes(...),(LPVOID)&dev);

appears to be the only place that misbehaves. More, the stuff even works. I
am more than surprised...

In case if I find any other such place, I am always ready to workaround it.
I think, G++ knows about that and does not joke any more. Is it that very
"magic key"?

Well, it is possible to do in PB C++ and use the code from CW C++. (The C
IMPort/EXPort (impex?) layer takes care of it all).

Best regards
Oleg




> From:     email@hidden
> Date:     Tue, 26 Mar 2002 10:15:26 -0800
> To:     Oleg Svirgstin <email@hidden>, email@hidden
> Subject: Re: [OSX] Did anybody use USBLib with C++?
> 
> 
> On Friday, March 22, 2002, at 05:10 PM, Oleg Svirgstin wrote:
> 
>> Hi,
>> 
>> Sorry for putting such a stupid problem to the eyes of the respected
>> qualified public.
>> 
>> Last time I wrote:
>>>> I have some problems with accessing calling "QueryInterface".
>>>> Is there an example of working with all these USB structures from C++?
>> 
>> "email@hidden" answered:
>>> Are you using Apple C++ (from ProjectBuilder) or Metrowerks C++
>>> from CodeWarrior?  Is your C++ app CFM?
>> 
>> I am using both, MW C++ for the "Big Application" (which is CFM), and an
>> Apple C/C++ bundle for USB access when launched under the OSX.
>> 
>> First I tried wrapping USB access into MW C/C++ and after a lot of
>> efforts
>> changed the approach to separate these OSX-only calls into a mach-0
>> bundle.
>> It looks like a good solution.
>> 
>> Generally this approach works, I have got most of pieces of code
>> working for
>> the big app from the bundle (in plain C). Finally it is a mix of C and
>> C++
>> (with some extern "C" tricks), I tested various aspects of this mix - it
>> works, too.
>> 
>> The problem arose when I started to assemble those pieces together,
>> wrapping
>> various plain C tasks into classes/objects.
>> 
>> The problem (I found a working workaround, but I would love to find a
>> simple
>> correct way to do the things...) is like that (Apple C++):
>> 
>> // I try to get IOUSBInterface from a device reference returned from
>> // IOGetMatchingServices. That piece of code worked fine in plain C.
>> //
>> // Omitting details, the C++ method where I have problems looks like
>> this:
>> //
>> // aClass::Method( io_service_t devRef)
>> // {
>> //   IOCFPlugInInterface **iodev;
>> //   IOUSBDeviceInterface **dev;
>> //   ...
>> //
>> //   IOCreatePlugInInterfaceForService(devRef,
>> //                                      CFUUIDGetUUIDBytes(...),
>> //                                      &iodev, &score);
>> //
>> //   err = (*iodev)->QueryInterface(iodev,  CFUUIDGetUUIDBytes(...),
>> //                              (LPVOID)&dev);//here I can't compile
>> //   ...
>> // }
>> //
>> 
>> The diagnostic tells "ANSI C++ forbids implicit conversions from
>> "void*" in
>> argument passing". I would be happy to know, where such conversion could
>> happen, since I pass arguments some of which are typed differently from
>> what
>> the plain-C interface wanted. (As far as I can see, I did not enforce
>> any
>> "strict ansi" anywhere - Apple C++ diagnostics and flags are a nice
>> saga of
>> its own.)
>> 
>> QueryInterface expects a void *thisPointer where I pass it a
>> "IOCFPlugInInterface **", but it would be rather a conversion "to void*"
>> than "from void*". I tried to cast iodev in various ways to "void*",
>> and it
>> drives me mad when I think there must be an easy variant I just did not
>> find. (Does it want a void**?)
>> 
> [....]
>> Now the bundle starts to look like a multi-layered sandwich
>> (C-interface to
>> communicate with the big app, then C++ complex of classes, calling here
>> and
>> there another level of C routines to do some house-keeping...
> [....]
>> Best regards
>> Thanks in advance for any suggestions
>> OIeg
> 
> I also encountered the warning about void * with IOKit and Apple (g)++.
> The result I came up with is the same as yours basically - all of my
> files which deal directly with IOKit types and interfaces are .c files.
> If someone knows the magic compiler switch to make this stuff work
> with the C++ compiler I'd also like to know.  However since you're
> going from PB to CodeWarrior you might be better off sticking
> with C since there are potential implementation incompatibilities
> between Apple C++ and MSL C++ (e.g. standard library classes)
> 
> I don't know if it's possible to avoid the layering you describe but
> it may at least be possible to factor it cleanly.   You may want to
> gather the various IOKit types into a common data type (probably
> a C struct) representing a single device or interface, then have
> your module deal with that.  When going to the CFM layer you can
> declare an opaque (void *) type to wrap your struct so that no
> one in CFM-land needs to know anything about the IOKit types.
> 
> hth,
> Chris
_______________________________________________
usb mailing list | email@hidden
Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/usb
Do not post admin requests to the list. They will be ignored.

References: 
 >Re: [OSX] Did anybody use USBLib with C++? (From: email@hidden)



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.