Re: How to pass strings from VC++.exe to C#.dll
<raghudr@gmail.com> ha scritto nel messaggio
news:526599dc-e8b0-4ac7-8e5a-4c9fb8b83db3@k7g2000hsd.googlegroups.com...
Now i have to return a string from C#.dll which is a COM component and
receive it in VC++.exe.I am not sure on how to do this
[...]
i changed the syntax to
public string ShowDialog(StringBuilder str)
{
string dest ="C:\\RAGHU\\rag.xml";
return dest;
}
OK, so this is the C# method returning the string (exposed to C++ using
COM), is it correct?
In Vc++ .exe
int _tmain(int argc, _TCHAR* argv[])
{
WCHAR pretval;
if (SUCCEEDED(hRes))
{
pretval = pDotNetCOMPtr->ShowDialog(str);//giving error in this
s tatement
}
So, I think that you are using #import directive from C++ to access the C#
COM component, correct?
If so, pretval in that case must not be a WCHAR, but a _bstr_t (representing
a COM BSTR).
So, please try this:
// Get string from C# COM component
_bstr_t s = pDotNetComPtr->ShowDialog( str );
In this way, you can have your string passed from C# to C++ using COM.
I would like to repeat to make it clear: the default method to pass strings
in COM is using *BSTR*. There are wrapper classes for BSTR, like CComBSTR
and _bstr_t. _bstr_t is usually used if you use the #import directive.
_bstr_t Class:
http://msdn.microsoft.com/en-us/library/zthfhkd6(VS.80).aspx
In general, if you have a COM component implemented in C#, with an
ITestClass::GetSomeString() method that returns a string, like this:
<code>
using System;
using System.Runtime.InteropServices;
namespace ComCSharp
{
[Guid("A64F7325-BB44-4624-A78A-62F60CA69638")]
public interface ITestClass
{
[DispId(1)]
string GetSomeString();
}
public class TestClass : ITestClass
{
public string GetSomeString()
{
string s = "Hello from C# COM component.";
return s;
}
}
}
</code>
You can call that from C++ using code like this:
<code>
#include "stdafx.h"
#import "ComCSharp.tlb"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
ComCSharp::ITestClassPtr p;
p.CreateInstance( __uuidof( ComCSharp::TestClass ) );
// Call method GetSomeString() from COM component (written in C#);
// this method returns a BSTR that is displayed in C++ console.
_bstr_t s = p->GetSomeString();
wcout << L"String from C#: " << s << endl;
CoUninitialize();
return 0;
}
</code>
I tested that on VC2008.
HTH,
Giovanni