Peter, Thanks for your great suggestions. I eventually ended up using the last method, the one that explicitly created the char array using AllocHGlobal. Is this method going to impact performance at all, or is using AllocHGlobal actually going to speed things up?
Thanks, Erick ----- Original Message ----- From: "Peter Stephens" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Tuesday, May 14, 2002 12:57 AM Subject: Re: [DOTNET] RCW for IFilter and LoadIFilter > > [PreserveSig] > > int GetText( > > [MarshalAs(UnmanagedType.U4)] > > out UInt32 pcwcBuffer, > > [MarshalAs(UnmanagedType.LPWStr)] > > out string awcBuffer > > ); > > Just looking at the docs for IFilter::GetText your interface is a little > off. > > pcwcBuffer is not out, but is in/out. In other words it is ref. > > Also note that awcBuffer is not a zero terminated string. It is just a > buffer. You might use a Char[] array instead of a String. > > Setup your interface like so: > > [PreserveSig] > Int32 GetText(ref UInt32 pcwcBuffer, > [MarshalAs(Unmanaged.LPArray, SizeParamIndex = 0)] > out Char[] awcBuffer) > > This is untested and might not work, but it should get you closer. > > If this does not work, you might try this: > > Int32 GetText(ref UInt32 pcwcBuffer, > [MarshalAs(Unmanaged.LPArray, SizeConst = 1024)] > ref Char[] awcBuffer); > > And then call it like this: > Char[] buff = new Char[1024]; > UInt32 buffSize = 1024; > Int32 ret = MyIFilter.GetText(ref buffSize, ref buff); > > You can be more precise with marshaling by using an IntPtr. > Here is an example that should definitaly work: > > Int32 GetText(ref UInt32 pcwcBuffer, IntPtr awcBuffer); > > And then call it like this: > Char[] data = null; > IntPtr buff = Marshal.AllocHGlobal(2048); // 1024 Chars; > try > { > Int32 buffSize = 1024; // 1024 Chars > Int32 ret = MyIFilter.GetText(ref buffSize, buff); > // You might want to do something with 'ret' > data = new Char[buffSize]; > Marshal.Copy(buff, data, 0, buffSize); > } > finally > { > Marshal.FreeHGlobal(buff); > } > > > I will confess that I only have a few weeks of Marshaling experience in > .NET. > > Hope this helps, > -- > Peter > > 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.