HOWTO: Build Custom COM Interface Marshalers with Visual C++
ID: Q164149
|
The information in this article applies to:
-
Microsoft Visual C++, 32-bit Editions, versions 4.0, 5.0, 6.0
SUMMARY
Custom COM interfaces that must be used cross-process or cross-apartment
require marshaling support. This article explains how to set up a Visual
C++ 4.0 project to build a self-registering standard marshaler from an IDL
script that describes your custom interface.
MORE INFORMATION
To generate a standard marshaler, write an IDL file that describes your
custom interface. The Microsoft Interface Definition Language (MIDL)
compiler is used to generate source files for the marshaler DLL from the
IDL file. Once these files are generated, you compile and link the code to
produce the marshaler DLL.
Versions of Visual C++ prior to 5.0 do not provide built-in rules for compiling IDL files using the MIDL compiler. However, you can use the custom build feature to add the
necessary rules to your project. Beginning with version 6.0, the build engine automatically calls MIDL.exe to compile IDL files. The Project/Settings dialog box has a MIDL tab to control the settings.
To generate a standard marshaler for the interface IMyInterface:
- Create a new Dynamic-Link Library project using Developer Studio. This
can either be a new project workspace or a subproject of an existing
workspace.
NOTE: The project name is also used as the name of the marshaler
DLL. For example, PS<interface>.
- Create a new file called IMyInterface.IDL, and enter the description of
your new interface.
- Insert the file IMyInterface.IDL into the project.
- Go to the project Build Settings dialog box and select IMyInterface.IDL
in all of the project's configurations.
NOTE: Make sure that you have selected the file in all of your project's
configurations.
- For Versions of Visual C++ prior to 6.0, click the Custom Build tab and type the following entries:
Description:
Compiling Interface Definition
Build Commands:
midl.exe /ms_ext /char unsigned /c_ext /out "$(InputDir)"
"$(InputPath)"
Output File(s):
$(InputDir)\$(InputName).h
$(InputDir)\dlldata.c
$(InputDir)\$(InputName)_i.c
$(InputDir)\$(InputName)_p.c
Close the Build Settings dialog box.
For version 6.0 and later, set the appropriate MIDL settings for IMyinterface.IDL on the MIDL tab of the Project/Settings dialog box.
- Add the file RPCHelp.c to your project by typing the following code:
#pragma comment(lib, "rpcndr.lib")
#pragma comment(lib, "rpcdce4.lib")
#pragma comment(lib, "rpcns4.lib")
#pragma comment(lib, "rpcrt4.lib")
- Add the following three files to your project:
dlldata.c
IMyInterface_i.c
IMyInterface_p.c
Since the files don't exist yet, you need to type the names in the
File Name field on the Insert File dialog box. When you get the warning
message that the file doesn't exist, click Yes.
- Use the following PSSample.def file as a model to create a DEF file for
your project:
LIBRARY PSSAMPLE
DESCRIPTION 'Sample custom interface marshaler'
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
NOTE: Make sure you change the library name to match the name of your
marshaler DLL.
- Add your new DEF file to the project.
- Open the project Build Settings dialog box and select your project
(make sure that you select all configurations). Click the C++ tab and
add the value REGISTER_PROXY_DLL to the Preprocessor Definitions field.
- Click the Custom Build tab and enter the following values:
Description:
Registering Custom Interface Marshaler
Build Command(s):
regsvr32 /s /c "$(TargetPath)"
echo regsvr32 exe. time > "$(OutDir)\regsvr32.trg"
Output File(s):
$(OutDir)\regsvr32.trg
Close the Build Settings dialog box.
Your project is now configured to properly build and register the custom
interface marshaler.
REFERENCES
Visual C++ Help file; Topic: "Specifying Custom Build Tools"
Visual C++ InfoViewer; Topic: "SDKs\Win32 SDK\RPC"
Additional query words:
MIDL marshal custom interface
Keywords : kbide kbVC kbVC400 kbVC500 kbVC600 TlsMisc
Version : winnt:4.0,5.0,6.0
Platform : winnt
Issue type : kbhowto
|