У меня есть обратный вызов COM из неуправляемой библиотеки DLL, которую мне нужно использовать в С#.
Неуправляемая DLL ожидает, что вызывающий абонент будет выделять память с помощью LocalAlloc
(который будет вызывать LocalFree
), заполнить его WSTR
и установить value
и chars
на указатель WSTR и длину строки соответственно.
Фрагмент кода, который я пытаюсь преобразовать в С#:
STDMETHODIMP CMyImpl::GetString(LPCSTR field, LPWSTR* value, int* chars) {
CStringW ret;
if (!strcmp(field, "matrix")) {
ret = L"None";
if (...)
ret.Append(L"001");
else if (...)
ret.Append(L"002");
else
ret.Append(L"003");
}
if (!ret.IsEmpty()) {
int len = ret.GetLength();
size_t sz = (len + 1) * sizeof(WCHAR);
LPWSTR buf = (LPWSTR)LocalAlloc(LPTR, sz);
if (!buf) {
return E_OUTOFMEMORY;
}
wcscpy_s(buf, len + 1, ret);
*chars = len;
*value = buf;
return S_OK;
}
return E_INVALIDARG;
}
Каким будет эквивалентный код С#?
EDIT: COM-интерфейс:
[id(2)] HRESULT GetString([in] LPCSTR field, [out] LPWSTR* value, [out] int* chars);