|
|||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
ContentsIntroduction
Webcam is a Simple Object Access Protocol (SOAP) project that will permit
client's software to get, from a Web Service, JPEG pictures captured by a
Webcam. It is my first step experiment in the world of SOAP after several
projects using COM/DCOM and ATL.
Server
We use Visual C++ and the Active Template Library (ATL) object Wizard to create a
Simple COM object, called // Don't have access to the container's window so just use the desktop. // RMK: If the desktop is not at least 24bits colors, then the grab will // fail HWND hWnd = ::GetDesktopWindow(); if ( hWnd ) { ...All functionalities needed to grab a picture on a Webcam are done in the class CWebCam. For example the method GrabFrame:
bool CWebCam::GrabFrame( CPicturePacker * pPacker, unsigned char ** ppPackedPicture, unsigned long * pnPackedPictureBytes )Use a reference to a CPicturePacker base class to pack the original picture's
bits, permitting to extend the packing to whatever format you want, as
mentioned before. In this sample I have written the class CIntelJpegPacker inheriting
from CPicturePacker and using the Intel® JPEG Library v1.5 to pack the picture
grabbed. You may consider using GDI+ for example to do the same.The rest of the source is dealing with COM and is nothing special. Server Interface
Our server needs to achieve two simple operations: grabbing a picture from a
Webcam and compressing it as a JPEG picture according to a compression ratio
defined by the caller. This is achieved in the HRESULT GrabFrame( [in] short nQuality, [out, retval] SAFEARRAY(unsigned char) * ppGrabbedPicture );The input parameter ' nQuality' represents the jpeg compression ratio, from 1 to 99.
A value of one meaning lowest quality (highest compression) and a value of
ninety-nine meaning highest quality (lowest compression).As an output return value the client get the jpeg picture in a SAFEARRAY of unsigned
char. We use this data type because it is fully supported by SOAP
(See faced problem 1 and 2).Our COM object supports the interface IErrorInfo as indicated by
the ISupportErrorInfo interface. It permits sending back to the
client information about possible issues encountered by the server. The good
point is that it is fully automatic for us. Read more about that point in
Microsoft SOAP User Guide: "Understanding the SOAP Fault <detail>
Contents".Before writing your interfaces check out the different types supported by SOAP in "Data Type Mappings" and there equivalence in programming languages. You find them in the Microsoft SOAP User Guide. Web Service
We simply use Microsoft WSDL Generator to wrap our COM object, Camera, into a
SOAP Web Service.
Now we have our Web Service! You must also define a Virtual Directory called WebServices in IIS. In the case you want to change the location of the Web Service you need to change the WSDL file generated by Microsoft WSDL Generator. Client
We use Visual C++ and Active Template Library (ATL) object Wizard to create an
ActiveX, called Webcam. This ActiveX is the client part of the Web Service
Webcam. It is connecting to the Webcam Web Service, receiving back a jpeg
picture and displaying it. Client InterfaceTo be able to grab a picture on the Webcam Web Service, we need to specify the location of the Web Service and a compression ratio. We define this interface: HRESULT GrabFrame([in] BSTR strWeb ServiceURL, [in] short nQuality);
If we get an error, we display it in a tooltip. To create and display the tooltip we use Windows Template Library (WTL). TestYou may test this Web Service after installing client ActiveX on this page. Problems Faced
History
|
||||||||||||||||||||||||||||||||||||||||