Преобразование строки ^ и набора строк ^ в константный символ * - PullRequest
0 голосов
/ 03 мая 2010

Использование VS2008 Managed C ++ для переноса DLL. Собственный метод принимает серию отдельных значений const char * и коллекцию значений char *. Собираюсь сделать пример функции:

Function1(char * value1, TF_StringList& catList);  

TF_StringList - это класс DLL с 3 методами вставки, один из которых я хочу использовать:

TF_StringList::insert(const char* str);  

Итак, я установил метод обёртки:

WrapperClass::callFunction(String^ mvalue1, ArrayList mcatList);  

mvalue1 конвертируется в const char * используя:

const char* value1 = (char*)(Marshal::StringToHGlobalAnsi(mvalue1)).ToPointer();  

Однако, когда я попадаю в коллекцию строк, я перебираю ее, получая каждую строку, используя индекс:

String^ mstr = mcatList[i];  

Попробовал все способы преобразования String ^ в const char *, и в каждом случае метод TF_StringList :: insert (const char * str) выдает ошибку C2663, связанную с константностью значения. В чем проблема?

Ответы [ 2 ]

1 голос
/ 03 мая 2010

Ваши фрагменты кода не являются полезными, они не могут скомпилироваться как дано и не показывают реальный источник ошибки. Просмотрите документы MSDN Library для C2663 , это не имеет никакого отношения к аргументу. Указатель объекта - проблема.

Помните, что ваш вызов StringToHGlobalAnsi () после публикации является утечкой памяти. У вас есть для вызова Marshal :: FreeHGlobal () в возвращенном IntPtr после того, как вы закончите со строкой. Кто-то должен будет скопировать это.

0 голосов
/ 10 мая 2010

1001 * включают *

#include <vcclr.h>

затем в область действия

{
    String^ s = gcnew String("test string");
    pin_ptr<const wchar_t> str = PtrToStringChars(s);

    size_t origsize = wcslen(orig) + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    char nstring[newsize];
    wcstombs_s(&convertedChars, nstring, origsize, orig, _TRUNCATE);

    CallFunction(&nstring);
}

Важной частью является закрепление указателя, чтобы он не перемещался на вас в сборщике мусора.

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