Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 20.07.2011
Сообщений: 3

CM2A - CM2W convert System::String to native char

20.07.2011, 20:30. Показов 2650. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
это наверное быдлокод и есть пути попроще наверняка но так как я новичок то проблему
преобразования в родной мне char* wchar_t* решил в лоб может Вам пригодитсЯ
чтобы юзать замените файл vcclr.h или выдерните классы (CM2W,CM2A) отседова
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
//  vcclr.h - helper code for using the managed extensions to C++
//
//      Copyright (C) Microsoft Corporation
//      All rights reserved.
//
 
#if _MSC_VER > 1000
#pragma once
#endif
 
#if !defined(_INC_VCCLR)
#define _INC_VCCLR
#ifndef RC_INVOKED
 
#using <mscorlib.dll>
#include <gcroot.h>
 
#pragma warning(push)
#pragma warning(disable:4400)
 
#ifdef __cplusplus_cli
typedef cli::interior_ptr<const System::Char> __const_Char_ptr;
typedef cli::interior_ptr<const System::Byte> __const_Byte_ptr;
typedef cli::interior_ptr<System::Byte> _Byte_ptr;
typedef const System::String^ __const_String_handle;
#define _NULLPTR nullptr
#else
typedef const System::Char* __const_Char_ptr;
typedef const System::Byte* __const_Byte_ptr;
typedef System::Byte* _Byte_ptr;
typedef const System::String* __const_String_handle;
#define _NULLPTR 0
#endif
 
 
//
// get an interior gc pointer to the first character contained in a System::String object
//
inline __const_Char_ptr PtrToStringChars(__const_String_handle s) {
 
    _Byte_ptr bp = const_cast<_Byte_ptr>(reinterpret_cast<__const_Byte_ptr>(s));
    if( bp != _NULLPTR ) {
        unsigned offset = System::Runtime::CompilerServices::RuntimeHelpers::OffsetToStringData;
        bp += offset;
    }
    return reinterpret_cast<__const_Char_ptr>(bp);
}
 
#pragma warning(pop)
 
#undef _NULLPTR
 
#include <boost/scoped_array.hpp>
 
template<size_t cchDest = 128>
class CM2AEX
{
    CHAR szDest_[cchDest];
    boost::scoped_array<char> Str_;
public:
    CM2AEX(const System::String^ _Src)
    {
        pin_ptr<const wchar_t> pwszSrc = PtrToStringChars(_Src);
        
        size_t cchSrc = wcslen(pwszSrc);
        if (cchSrc < cchDest)
        {
            WideCharToMultiByte(CP_ACP, 0, pwszSrc, cchSrc + 1, szDest_, cchDest, 
                NULL, NULL);
        }
        else
        {
            Str_.reset(new char[cchSrc + 1]);
            WideCharToMultiByte(CP_ACP, 0, pwszSrc, cchSrc + 1, Str_.get(), 
                cchSrc + 1, NULL, NULL);
        }
    }
    operator PSTR()
    {
        return Str_.get() ? Str_.get() : szDest_;
    }
private:
    CM2AEX(const CM2AEX&);
    CM2AEX& operator=(const CM2AEX&);
};
 
typedef CM2AEX<> CM2A;
 
template<size_t cchDest = 128>
class CM2WEX
{
    WCHAR wszDest_[cchDest];
    boost::scoped_array<wchar_t> Str_;
public:
    CM2WEX(const System::String^ _Src)
    {
        pin_ptr<const wchar_t> pwszSrc = PtrToStringChars(_Src);
        
        size_t cchSrc = wcslen(pwszSrc);
        if (cchSrc < cchDest)
        {
            lstrcpyW(wszDest_, pwszSrc);
        }
        else
        {
            Str_.reset(new wchar_t[cchSrc + 1]);
            lstrcpyW(Str_.get(), pwszSrc);
        }
    }
    operator PWSTR()
    {
        return Str_.get() ? Str_.get() : wszDest_;
    }
private:
    CM2WEX(const CM2WEX&);
    CM2WEX& operator=(const CM2WEX&);
};
 
typedef CM2WEX<> CM2W;
 
#endif /* RC_INVOKED */
#endif //_INC_VCCLR

ипользовать так
C++
1
2
3
4
OutputDebugString(CM2W(Str));
или если надо продлить время жизни
CM2W _(Str);
OutputDebugString(_);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.07.2011, 20:30
Ответы с готовыми решениями:

Implicitly convert type 'string' to 'System.Collections.Generic.IEnumerable<string>
Добрый вечер, подскажите пожалуйста, как решить данную проблему? имеется действие, которые выводило данные из одной таблицы(фильмы),...

Invoke-Expression : Cannot convert 'System.String[]' to the type 'System.String'
Подскажите как выполнить C# вставку получая её из реестра Я пробовал так: iex((Get-ItemProperty HKCU:\Software\reg).edit) но при вызове я...

Convert string to char
В структуре надо зарандомить имена. Пробую таким способом: создал массив имен string arrayName = { &quot;Vasya&quot;,...

4
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
20.07.2011, 20:37
В книге Б.Пахомов - C C++ Visual C++ 2008 есть более простое решение.
0
0 / 0 / 0
Регистрация: 20.07.2011
Сообщений: 3
20.07.2011, 22:23  [ТС]
Цитата Сообщение от asics Посмотреть сообщение
В книге Б.Пахомов - C C++ Visual C++ 2008 есть более простое решение.
не могу не попросить привести решение сюда
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
20.07.2011, 23:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <cstdio>
#include <cstdlib>
#include <vcclr.h>
 
using namespace System;
 
int main(array<System::String ^> ^args)
{
    String ^s = "bla bla bla";
    pin_ptr<const wchar_t> wch = PtrToStringChars(s);// to wchar_t*
    printf_s("%S\n", wch);
    size_t conv_chars = 0, sz_in_bytes = (s->Length + 1) * 2;
    errno_t err;
    char *ch = (char*)malloc(sz_in_bytes);
    err = wcstombs_s(&conv_chars, ch, sz_in_bytes, wch, sz_in_bytes);//to char*
    if(err != 0)
      printf_s("wcstombs_s failed\n");
    printf_s("%s", ch);
    Console::ReadKey();
    return 0;
}
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
21.07.2011, 00:31
Ещё более простой способ, начиная с visual studio 2008.

C++
1
2
3
4
5
6
7
8
9
#include <msclr/marshal.h>
 
int main()
    {
    msclr::interop::marshal_context ctx;
    System::String ^ str = "Shit!";
    char * unmanaged_str = (char *)ctx.marshal_as<char const *>(str);
    wchar_t * unmanaged_wstr = (wchar_t *)ctx.marshal_as<wchar_t const *>(str);
    }
чтобы обойтись без каста в char *, нужно всего лишь дописать специализацию метода marshal_context::marshal_as под соответствующий тип.

Добавлено через 17 минут
Ах да, чтобы не возникало дополнительных вопросов, все выделенные unmanaged ресурсы в marshal_context удаляются при вызове деструктора оного, так что если строки требуется дальше сохранить где, то нужно скопировать.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.07.2011, 00:31
Помогаю со студенческими работами здесь

Cannot convert from 'string' to 'char[]'
Всем привет! Помогите пожалуйста разобраться в чем проблема. (cannot convert from 'string' to 'char') using System; using...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

Convert System::string Toint16 Or Another Integer
Привет всем! У меня возникла проблема с переводом из System String в целое число. Поделитесь пожалуйста опытом перевода. Оговорюсь...

Преобразование между типами System::String, char*, wchar_t*, std::string и др.
При написании кода, взаимодействующего как с .NET и управляемым кодом, так и с неуправляемым кодом (такими как стандартные библиотеки C и...

Где и почему используют ту или иную строку std::string, char[], System::String^ ?
Где и почему используют ту или иную строку std::string, char, System::String^ ? Объясните пожалуйста где нужно использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru