473,799 Members | 3,093 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Change values in SafeArray

I have some C++ code which creates a SafeArray and passes it to my C#
dll using COM:

SAFEARRAY *psaOut = SafeArrayCreate Vector(VT_BSTR, 0, 3);

VARIANT pVarOut;
VariantInit(&pV arOut);
pVarOut.vt = VT_ARRAY | VT_BSTR;
pVarOut.parray = psaOut;

InvokeHelper(Di spId, DISPATCH_METHOD , VT_I4, (void*)&result, parms,
&pVarIn, &pVarOut);

My C# code can see this fine. However, if I change an element of the
array, it isnt reflected when I return.

My question is, is my C# method signature the problem:

[Out,MarshalAs(U nmanagedType.Sa feArray, SafeArraySubTyp e =
VarEnum.VT_BSTR )] ref String[] OutputArray

I assume this is the correct signature for what I need to do, since I
can access the array with no problems.

Might be a tricky one, but any help would be appreciated.

Steven


*** Sent via Developersdex http://www.developersdex.com ***
Jan 15 '08 #1
4 6551
"Steven Blair" <st**********@b tinternet.comwr ote in message
news:%2******** ********@TK2MSF TNGP04.phx.gbl. ..
>I have some C++ code which creates a SafeArray and passes it to my C#
dll using COM:

SAFEARRAY *psaOut = SafeArrayCreate Vector(VT_BSTR, 0, 3);

VARIANT pVarOut;
VariantInit(&pV arOut);
pVarOut.vt = VT_ARRAY | VT_BSTR;
pVarOut.parray = psaOut;

InvokeHelper(Di spId, DISPATCH_METHOD , VT_I4, (void*)&result, parms,
&pVarIn, &pVarOut);

My C# code can see this fine. However, if I change an element of the
array, it isnt reflected when I return.

My question is, is my C# method signature the problem:

[Out,MarshalAs(U nmanagedType.Sa feArray, SafeArraySubTyp e =
VarEnum.VT_BSTR )] ref String[] OutputArray

I assume this is the correct signature for what I need to do, since I
can access the array with no problems.

Might be a tricky one, but any help would be appreciated.

Steven


*** Sent via Developersdex http://www.developersdex.com ***

You must pass the array by reference.
pVarOut.vt = VT_ARRAY|VT_BST R|VT_BYREF;

Why are you using dispatch calls from C++, while early binding is perfectly
possible?

Willy.

Jan 15 '08 #2
For the moment, I am returning the Array as a return value and that
works but I will try the VT_BYREF.
It shouldn't matter that we are passing an array of BSTR, I was begining
to wonder if I could only pass ints etc?

As for the approach for calling the methods, InvokeHelper is the only
way I know to be honest. Do you mean link the dll in statically and make
calls this way?

Thank you for the reply, was worried no one would.

Steven

*** Sent via Developersdex http://www.developersdex.com ***
Jan 16 '08 #3
"Steven Blair" <st**********@b tinternet.comwr ote in message
news:OO******** ******@TK2MSFTN GP02.phx.gbl...
For the moment, I am returning the Array as a return value and that
works but I will try the VT_BYREF.
It shouldn't matter that we are passing an array of BSTR, I was begining
to wonder if I could only pass ints etc?

As for the approach for calling the methods, InvokeHelper is the only
way I know to be honest. Do you mean link the dll in statically and make
calls this way?
No, it's just a matter of using the COM support offered by the VC++
compiler.

Say you have a C# source file myAssembly, that declares/defines an interface
like this:

[InterfaceType(C omInterfaceType .InterfaceIsDua l)]
[Guid("xxxxxxxxx xxxxxxxxxxxxxx" )]
public interface IFoo
{
void Bar(ref string[] param);
}
After building and registering this assembly (see regasm /tlb ...), you will
find a typelib cthat can be imported in your C++ code.

#import ".\myAssembly.t lb" no_namespace named_guids raw_interfaces_ only

above will tell the pre-compiler to build a header from the tlb which will
automatically be included by the C++ compiler.
This header file contains all you need to use early binding using smart
pointer support for your COM interface(s).

// Initialize the COM library first (calling CoInitialize or
CoInitializeEx)
...

HRESULT hr = 0;
IFooPtr pFoo;
// create and fill the safearray
SAFEARRAY * sa = ....;
hr = pFoo.CreateInst ance(__uuidof(I Foo));
if(!FAILED(hr))
{
pFoo->Bar(&sa); // call Bar passing a reference to a SAFEARRAY of
BSTR
// access safearray returned by C#
...
}
...

Please search MSDN for more details on using "COM support in C++".
Willy.



Jan 16 '08 #4
Ok,

Thanks for the help, much appreciated.

*** Sent via Developersdex http://www.developersdex.com ***
Jan 16 '08 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
1680
by: mic | last post by:
I'm stuck with following problem. Using webbrowser control I try to make custom-made request. I found working example of this written in VBS but porting it to Python doesn't seem to work. The key is navigate (or navigate2) method, that accepts PostData as one of it's parameters. As stated in reference: "The post data specified by PostData is passed as a SAFEARRAY Data Type structure. The variant should be of type Array and point to a...
4
10324
by: Roland Moschel | last post by:
Hi there ! I have some Problems to get a SafeArray out of a COM Server written in (Unmanaged) C++. From (unmanaged) Visual Basic , everything is ok , but unfortunately in C# I get an exception. Can anybody help me ?
1
2166
by: Doug Taylor | last post by:
How do I write the C# equivalent of the following VC6 methods? They will be exposed on a COM interface and used by VC6, VB6, and .NET apps. int SetPolygon(SAFEARRAY(double)points); int SetRectangle(SAFEARRAY(double)rects_info); int SetManyPolygons(SAFEARRAY(SAFEARRAY(double))points); Each point is an x/y pair. Each rects_info is an origin x/y, width, and height. --
5
6929
by: Tronster Hartley | last post by:
I've written an ATL 7.1 component and have a C# 1.1 client that is consuming it. The ATL component has a method with a that returns a SAFEARRAY of INTs, but my C# component chokes on it. The C# code: // Display a message box with a value from the ATL control private void GoButton_Click(object sender, System.EventArgs e) {
5
3113
by: Ahmad Jalil Qarshi | last post by:
i want to store binary data into my property. i read earlier positing on "microsoft.public.dotnet.languages.vc" group with subject as SAFEARRAY in attributed ATL7 Project. i followed the same approach but unfortunately i failed to do that. i declared the property accessors as follow in my idl file. HRESULT Data( SAFEARRAY * *pVal); HRESULT Data( SAFEARRAY * newVal); when i compile code i get following error.
1
6017
by: Brendan Grant | last post by:
I’ve got a C# library that I’ve built into a COM component that will be used from a VC++ 6 application and while the creation of the COM object side of things seem to be working fine, using the object fully is another matter. On the C# side of things I’ve got an object defined like so: public class PID : IPID { private string type;
5
6350
by: Maxim | last post by:
Hi all, I'm calling a COM Interface method that returnes SafeArray wrapped into variant. Is it possible to convert it to managed array? Because working with SAFEARRAY directly is a bit complicated. Or maybe there is a managed wrapper class for safe array? Thanks in advance.
1
2834
by: Christian Schmidt | last post by:
Hi all, I need to implement an unmanaged function that gets a SafeArray and hands it over to a managed function having the managed array-type. Using MarshalAs I can call unmanaged functions having SafeArray from managed code. But here I need this vice-versa... I assume it is doable with MarshalAs magic, but how? Thanks Christian
0
3225
skeptics
by: skeptics | last post by:
Trying to pass a SafeArray that i get form Request.BinaryRead Method in classic asp to a c# com interop component. In this thread i found a solution to pass and cast a normal asp safearray in to a c# array: http://bytes.com/groups/net/114755-passing-safearray-bytes-vbscript-managed-com-object-c#goto_threadtools but no matter what i try. i cant pass a array that i get from Request.BinaryRead Method in to the component. i always get a error...
0
9685
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9538
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10473
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10249
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
9068
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
5461
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
1
4138
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
3755
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2937
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.