Строка для C # из C ++ COM - PullRequest
       8

Строка для C # из C ++ COM

3 голосов
/ 12 марта 2012

У меня есть C ++ DLL, и некоторые функции возвращают строки с нулевым символом в конце Unicode:

void SomeFunc(wchar_t* StrBuf)

Вызывающая сторона должна выделять StrBuf - строка может содержать до 256 символов. Эта DLL также предоставляет COM-объект для использования этой DLL из C # через COM. Определение в IDL:

[id(1), helpstring("bla")]
HRESULT SomeFunc([in,out] BSTR* TextStr, [out,retval] LONG* RetValue);

В настоящее время код C # выглядит следующим образом:

string val = new string('\0', 256); // Allocate memory
MyComObj.SomeFunc(ref val); // Get string
val = val.Substring(0, val.IndexOf('\0')); // Convert from null-terminated string

Есть ли способ определить такую ​​функцию COM, чтобы ее было проще использовать из C #? Прямо сейчас это выглядит некрасиво и требует трех строк для вызова функции или пяти строк, если функция имеет два строковых параметра.

Ответы [ 3 ]

0 голосов
/ 15 ноября 2012

Если память для строки в клиенте выделяет и заполняет ее для COM-сервера, вы должны использовать StringBuilder:

// IDL code
HRESULT GetStr(/*[out]*/ LPSTR pStr);

// Interop
void GetStr(/*[out]*/ [MarshalAs(UnmanagedType.LPStr)] StringBuilder pStr);

// C# code
var str = new StringBuilder(256);
MyComObj.GetStr(a);

Тогда StringBuilder будет пустым или заполненным символами.

0 голосов
/ 20 ноября 2012

решаемая.В C ++ я использую этот код в оболочке COM:

STDMETHODIMP MyClassClass::SomeFunc(BSTR* OptionValue, LONG* RetValue)
{
    *RetValue = 0;
    UNICODECHAR txt[MAXSTATSTRLEN];

    //... Copy text to txt variable
    *OptionValue = W2BSTR(txt);
    return S_OK;
}

IDL:

[id(1), helpstring("")] HRESULT SomeFunc([out] BSTR* OptionValue, [out,retval] LONG* RetValue);

В C # его теперь можно легко вызвать:

string val;
MyComObj.SomeFunc(out val);
0 голосов
/ 13 марта 2012

Если вы выставили это как COM-объект, просто используйте Visual Studio, чтобы добавить ссылку на ваш объект.Он автоматически сгенерирует сборку для вас (я полагаю, они называют это вызываемой оболочкой COM).

Это предоставит доступ к вашим методам COM-объектов в .NET и будет работать, если вы не начнете пытаться передать некоторые пользовательские структуры.

Вот некоторые ресурсы для вас:

COM Callable Wrapper

COM-взаимодействие Часть 1: Учебник по клиенту C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...