C ++ / CLI Converting System :: String в const char * - PullRequest
2 голосов
/ 27 февраля 2010

Я использую Microsoft Visual C ++ 2008 Я хочу соединить несколько строк, а затем использовать их с командой "system".

Я пытался сделать это так:

System::String^ link;
link = "wget.exe --output-document=log http://ADDRESS";
link = link + System::String::Copy(textBox_login->Text);
link = link + "&passwd=";
link = link + System::String::Copy(textBox_passwd->Text);
system(link); //LINE WITH ERROR

Но я получаю ошибку C2664: «система»: невозможно преобразовать параметр 1 из «System :: String ^» в «const char *»

Я ценю любую помощь;)

Ответы [ 4 ]

4 голосов
/ 27 февраля 2010

Посмотрите на этот вопрос и этот вопрос .

По сути, проблема в том, что функция system ожидает переменную типа const char*, а не System::String.

Так что вам нужно преобразовать строку в const char * (используя код из этот ответ ) и использовать его в качестве аргумента для системной функции.

IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
const char* linkStr = static_cast<char*>(p.ToPointer());
system(linkStr);
Marshal::FreeHGlobal(p);
2 голосов
/ 27 февраля 2010

Чтобы использовать систему, как вы, вам понадобится Marshalling. Это требует дополнительных мер предосторожности, которые могут привести к непредвиденной боли.

Я рекомендую вам вызывать wget через System :: Process class

Он намного лучше интегрируется с .NET, и вы можете использовать System :: String ^ напрямую

0 голосов
/ 27 февраля 2010

У вас есть техническое решение для вашей проблемы, но вот пара других вещей, которые вы могли бы рассмотреть:

  • Вместо того, чтобы открывать процесс для выполнения HTTP-запроса, используйте API (.NET или C ++, в .NET это гораздо проще, чем в стандартном C ++, посмотрите WebRequest ), чтобы сделать этот. Особенно, если вы планируете что-то сделать с ответом.

  • В общем, если вы добавляете к String несколько раз, предпочтите StringBuilder. Поскольку String является неизменным в .NET, для каждого добавления требуется новый String.

  • В этом случае не используйте String, чтобы сначала создать URL. Вместо этого используйте System :: Uri .

0 голосов
/ 27 февраля 2010

после того, как сказал Якоби, почти все работает нормально, но когда доходит до

link = link + "&passwd=";

это сокращает все, что является послесловием в строке. когда я удаляю '&', он работает просто отлично ... мне нужен знак '&'

...