Re: Interop Prob w/ LPArray - COM Client throwing exception

Aaron Bawcom <[email protected]> Mon, 17 Jun 2002 17:25:03 -0700
Newsgroups gmane.comp.windows.devel.dotnet.general
Message-ID <DOTNET%[email protected]>
I apologize for not being clear in my original post. The access violation
occurs at the statement:

iMyInterface2->doit( pBytes, 20 );

I've tried regular pointers without the ATL housekeeping and the same
problem occurs.

On Mon, 17 Jun 2002 11:56:47 +0300, Dumitru Sbenghe <[email protected]>
wrote:

>You use a smart pointer which will call Release after the call
>of CoUnitialize(); This can cause an access violation;
>
>Dumitru Sbenghe
>
>> -----Original Message-----
>> From: The DOTNET list will be retired 7/1/02
>> [mailto:[email protected]]On Behalf Of Aaron Bawcom
>> Sent: Monday, June 17, 2002 7:16 AM
>> To: [email protected]
>> Subject: [DOTNET] Interop Prob w/ LPArray - COM Client throwing
>> exception
>>
>>
>> I would appreciate any help/insight that anyone can give on this
problem.
>> I have a legacy app that uses the following IDL interface definition:
>>
>> interface IMyInterface2 : IUnknown
>> {
>>  HRESULT doit( [in, size_is(msgLength)]UCHAR* msg, [in]ULONG
>> msgLength );
>> };
>>
>> When my legacy COM Client calls my .Net component that implements this
>> interface, an access violation (0xC0000005) exception is thrown. I've
>> tried everything and can not figure out why the exception is thrown in
the
>> COM Client.
>>
>> Here is the COM Client:
>> #include "stdafx.h"
>> #include "IMyInterface2_h.h"
>> #include "IMyInterface2_i.c"
>>
>> int _tmain(int argc, _TCHAR* argv[])
>> {
>>  HRESULT hr = S_OK;
>>
>>         hr = ::CoInitialize( NULL );
>>
>>  CLSID rcid = {0};
>>  rcid.Data1 = 0x5F850215; rcid.Data2 = 0x7AC2; rcid.Data3 = 0x48b8;
>>  rcid.Data4[0] = 0xA8; rcid.Data4[1] = 0xCF; rcid.Data4[2] = 0xA0;
>>  rcid.Data4[3] = 0x08; rcid.Data4[4] = 0xF7; rcid.Data4[5] = 0x33;
>>  rcid.Data4[6] = 0xD6; rcid.Data4[7] = 0x61;
>>
>>  CComPtr<IMyInterface2> iMyInterface2;
>>
>>         hr = iMyInterface2.CoCreateInstance( rcid, NULL,
>> CLSCTX_INPROC_SERVER );
>>
>>  UCHAR* pBytes = (UCHAR*)::CoTaskMemAlloc( 20 );
>>
>>  ::ZeroMemory( pBytes, 20 );
>>
>>  iMyInterface2->doit( pBytes, 20 );
>>
>>  ::CoUninitialize();
>>
>>  return 0;
>> }
>>
>> And here is the .Net service component. The .Net component must be
copied
>> in the same directory as the COM client.
>>
>> using System;
>> using System.Runtime.InteropServices;
>>
>> namespace ComSrv
>> {
>>  [GuidAttribute("5F850215-7AC2-48b8-A8CF-A008F733D661")]
>>  public class MyClass : IMyInterface2
>>  {
>>   public void doit( byte[] msg, ulong msgLength )
>>   {
>>   }
>>  }
>>
>>  [ComImport]
>>  [GuidAttribute("B55AFAEB-BC7D-4ca9-8065-F9A45FE378B6")]
>>  [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
>>  public interface IMyInterface2
>>  {
>>   void doit(
>>    [In, MarshalAs( UnmanagedType.LPArray,
>> SizeParamIndex=1, ArraySubType=UnmanagedType.U1 )]byte[] msg,
>>    [In]ulong msgLength );
>>  }
>> }
>>
>> You can read messages from the DOTNET archive, unsubscribe from DOTNET,
or
>> subscribe to other DevelopMentor lists at http://discuss.develop.com.
>
>You can read messages from the DOTNET archive, unsubscribe from DOTNET, or
>subscribe to other DevelopMentor lists at http://discuss.develop.com.

You can read messages from the DOTNET archive, unsubscribe from DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.