Напримеру меня есть c # COM-объект с такой функцией:
int GetString([In, Out, MarshalAs(UnmanagedType.LPStr)]ref string str)
, тогда я вызываю int из c ++ (в c ++ COM-объект используется через ключевое слово #import
), в сгенерированном методе оболочки объявлен как:
GetString(LPSTR * str, long * retVal)
я называю это так:
char myStr[40];
LPSTR buf = (LPSTR)myStr;
LPSTR pBuf = &buf;
pComObject->GetString(pBuf);
, что странно:
1) myStr не заполнено, и значение buf
изменяется (ононе то же самое с myStr
после вызова), поэтому, я полагаю, что c # marshaller выделяет новый блок памяти
2), если c # выделяет память, поэтому я должен вызывать free(buf);
или нет?