TROUBLE Passing BYTE Array from Client to COM OUTPROC Server [modified]
-
Ok. Open the registry editor and search for the following key:
{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}
If you find if right click on it and select "Export". Post the contents of the file this generates.Steve
Hi Steve, i found two registry entries.. 1st Entry
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}]
@="IDataProvider"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\NumMethods]
@="12"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid]
@="{00020424-0000-0000-C000-000000000046}"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\TypeLib]
@="{0381FBF3-32C1-4AF1-B6DD-EFB51815DD72}"
"Version"="1.0"2nd Registry Entry:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}]
@="PSFactoryBuffer"[HKEY_CLASSES_ROOT\CLSID\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\InProcServer32]
@="D:\\VC++\\Sample Applications\\BytComp\\DebugPS\\BytCompPS.dll"
"ThreadingModel"="Both" -
Hi Steve, i found two registry entries.. 1st Entry
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}]
@="IDataProvider"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\NumMethods]
@="12"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid]
@="{00020424-0000-0000-C000-000000000046}"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\TypeLib]
@="{0381FBF3-32C1-4AF1-B6DD-EFB51815DD72}"
"Version"="1.0"2nd Registry Entry:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\CLSID\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}]
@="PSFactoryBuffer"[HKEY_CLASSES_ROOT\CLSID\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\InProcServer32]
@="D:\\VC++\\Sample Applications\\BytComp\\DebugPS\\BytCompPS.dll"
"ThreadingModel"="Both"First note that the proxy-stub you built is creatable:
K ARUN KUMAR wrote:
[HKEY_CLASSES_ROOT\CLSID\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\InProcServer32] @="D:\\VC++\\Sample Applications\\BytComp\\DebugPS\\BytCompPS.dll" "ThreadingModel"="Both"
But your interface isn't using it:
K ARUN KUMAR wrote:
[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32] @="{00020424-0000-0000-C000-000000000046}"
{00020424-0000-0000-C000-000000000046}
is the universal marshaller, not your proxy-stub ({A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}
). Also I notice your interface is marked with[dual]
. This means the interface has to be automation compatible and should only use a limited number of types (which doesn't includeBYTE
arrays). Do you get warnings when you compile theIDL
file? Did you ignore them? Since you exported these keys you're free to tinker with them as they can easily be restored using the exported files. Change this key:[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"So that it looks like this:
[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32]
@="{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}"NOTE: Don't alter the exported files, make the changes in the registry. Alternatively copy the exported file, make the change in the copy, then double click the copy.
Steve
-
First note that the proxy-stub you built is creatable:
K ARUN KUMAR wrote:
[HKEY_CLASSES_ROOT\CLSID\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\InProcServer32] @="D:\\VC++\\Sample Applications\\BytComp\\DebugPS\\BytCompPS.dll" "ThreadingModel"="Both"
But your interface isn't using it:
K ARUN KUMAR wrote:
[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32] @="{00020424-0000-0000-C000-000000000046}"
{00020424-0000-0000-C000-000000000046}
is the universal marshaller, not your proxy-stub ({A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}
). Also I notice your interface is marked with[dual]
. This means the interface has to be automation compatible and should only use a limited number of types (which doesn't includeBYTE
arrays). Do you get warnings when you compile theIDL
file? Did you ignore them? Since you exported these keys you're free to tinker with them as they can easily be restored using the exported files. Change this key:[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32]
@="{00020424-0000-0000-C000-000000000046}"So that it looks like this:
[HKEY_CLASSES_ROOT\Interface\{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}\ProxyStubClsid32]
@="{A12EAEC2-2B64-470B-93AF-EFE0855DD3AC}"NOTE: Don't alter the exported files, make the changes in the registry. Alternatively copy the exported file, make the change in the copy, then double click the copy.
Steve
Hi Steve, You are amazing. The change worked. But when iam building the server, it again modifying the registry setting to default Marshaller GUID. How to set my ProxtStub GUID as default?
-
Hi Steve, You are amazing. The change worked. But when iam building the server, it again modifying the registry setting to default Marshaller GUID. How to set my ProxtStub GUID as default?
The problem is your interface is marked as an automation interface but it uses types that are not automation compatible. As I said, I'm sure the MIDL compiler would have warned you about this, and you should always investigate compiler warnings. The are a number of ways to fix this:
- Don't use an automation compatible interface. Remove the
dual
and all the[id]
attributes, and derive fromIUnknown
instead ofIDispatch
. You will not need theIDispatchImp
base class in you server implementation either. - Add another interface to the object (which isn't
dual
and derives fromIUnknown
, as described above) to contain the non-automation compatible methods. - Manually make the changes I described after RegisterTypeLib[^] makes the "wrong" ones. This is a hack though: why use an automation-compatible interface that automation clients will not be able to call?
- Give my posts good marks ;)
Steve
- Don't use an automation compatible interface. Remove the
-
The problem is your interface is marked as an automation interface but it uses types that are not automation compatible. As I said, I'm sure the MIDL compiler would have warned you about this, and you should always investigate compiler warnings. The are a number of ways to fix this:
- Don't use an automation compatible interface. Remove the
dual
and all the[id]
attributes, and derive fromIUnknown
instead ofIDispatch
. You will not need theIDispatchImp
base class in you server implementation either. - Add another interface to the object (which isn't
dual
and derives fromIUnknown
, as described above) to contain the non-automation compatible methods. - Manually make the changes I described after RegisterTypeLib[^] makes the "wrong" ones. This is a hack though: why use an automation-compatible interface that automation clients will not be able to call?
- Give my posts good marks ;)
Steve
Thanks a lot buddy. Sure.. Arun
- Don't use an automation compatible interface. Remove the