Получить строку из метода dll на C++ в .net
От: Alexys Россия  
Дата: 21.03.11 19:39
Оценка:
Может подскажете как из dll C++ вернуть строку в методе?

имеем C++
extern "C" MYAPI_API char* GetStringFromDll(void);

MYAPI_API char* GetStringFromDll()
{
  return "Testing";
}


на C#
[System.Runtime.InteropServices.DllImport("My.dll")]
public static extern IntPtr GetStringFromDll();

не хочет работать
IntPtr ptr = GetStringFromDll();
string str = Marshal.PtrToStringAuto(ptr);

------------------------------------------
или
extern "C" MYAPI_API int GetStringFromDll2(char* result);

MYAPI_API int GetStringFromDll2(char* result)
{
  strcpy_s(result, 7,  "Testing");
  return 0;
}


на C#

[System.Runtime.InteropServices.DllImport("My.dll")]
public static extern int GetStringFromDll2(string result);

GetStringFromDll2
string result= "";
GetStringFromDll2(result);


возвращается та же пустая строка (((

Что делать? Как вернуть строку из С++ длл ?
Re: Получить строку из метода dll на C++ в .net
От: TK Лес кывт.рф
Дата: 21.03.11 19:52
Оценка:
Здравствуйте, Alexys, Вы писали:

A>Может подскажете как из dll C++ вернуть строку в методе?


A>имеем C++

A>
A>extern "C" MYAPI_API char* GetStringFromDll(void);

A>MYAPI_API char* GetStringFromDll()
A>{
A>  return "Testing";
A>}
A>


A>на C#

A>
A>[System.Runtime.InteropServices.DllImport("My.dll")]
A>public static extern IntPtr GetStringFromDll();

A>не хочет работать
A>IntPtr ptr = GetStringFromDll();
A>string str = Marshal.PtrToStringAuto(ptr);
A>


Должно работать. Только, зачем Marshal'у голову морочить если вам заранее известно, что строка не в unicode?


A>------------------------------------------

A>или
A>
A>extern "C" MYAPI_API int GetStringFromDll2(char* result);

A>MYAPI_API int GetStringFromDll2(char* result)
A>{
A>  strcpy_s(result, 7,  "Testing");
A>  return 0;
A>}
A>


A>на C#


A>
A>[System.Runtime.InteropServices.DllImport("My.dll")]
A>public static extern int GetStringFromDll2(string result);

A>GetStringFromDll2
A>string result= "";
A>GetStringFromDll2(result);
A>


A>возвращается та же пустая строка (((


Надо использовать StringBuilder с заранее выделенным буфером. Все строки — readonly.

A>Что делать? Как вернуть строку из С++ длл ?


Посмотрите на pinvoke.net там полно примеров.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Получить строку из метода dll на C++ в .net
От: Alexys Россия  
Дата: 21.03.11 20:25
Оценка:
Здравствуйте, TK, Вы писали:

...

TK>Надо использовать StringBuilder с заранее выделенным буфером. Все строки — readonly.


A>>Что делать? Как вернуть строку из С++ длл ?


TK>Посмотрите на pinvoke.net там полно примеров.


Спасибо огромное! С Использованием StringBuilder получил строку.
Теперь можно и xml собрать внутри и передать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.