powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / _bstr_t преобразовать в строку
15 сообщений из 40, страница 2 из 2
_bstr_t преобразовать в строку
    #39334011
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

чистый вариант на мой взгляд - вернуть BSTR, маршаллер c# память почистит

Код: plaintext
1.
2.
3.
4.
5.
6.
extern "C" __declspec(dllexport) BSTR GetSomeText() 
{
	wchar_t * v = L"ABC";
	size_t sz = 3;
	return ::SysAllocStringLen(v,sz); // или ::SysAllocString(v) для null-terminated строки
};



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
    [DllImport(@"D:\projweb\ConsoleTester\Debug\dlib.dll")]
        [return: MarshalAs(UnmanagedType.BStr)]
        public static extern string GetSomeText();

        static void Main(string[] args)
        {
            string str = GetSomeText();
            Console.WriteLine(str);            
        }
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39334217
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

твой код у меня успешно отработал, как ни странно ))

из замеченного - VARIANT - желательно всегда инициализировать(VariantInit)
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39334429
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилArbit,

твой код у меня успешно отработал, как ни странно ))

из замеченного - VARIANT - желательно всегда инициализировать(VariantInit)
1. Код отработал нормально как чисто консольное приложение на С++ или как dll вызванная из С#?
2. Строка bstr_t передавалась созданная руками
Код: plaintext
1.
_bstr_t resValue = L"ABC";



или созданная COM объектом в функции GetWmiInfo()
Код: plaintext
1.
_bstr_t resValue = vtProp.bstrVal;


Мне кажется, что _bstr_t resValue COM и что _bstr_t resValue обычный - это не одно и то же

Я прочитал на одном из форумов что манипуляции со строками COM как с обычными строками не прокатывают. Это особые строки.
А вот как с ними работать и не нашел пока.

В гугле нашел пока только это: https://msdn.microsoft.com/en-us/library/ms235631.aspx
что и попытался применить, но пока безрезультатно. ( там есть примеры для всех вариантов)
Может в компиляторе моем... , У меня студия 2013
Но скорее всего это в моих руках(пока еще далеко не ровных) и в голове. :)
Потому и пришел за помощью.

Если у тебя все работает, скинь мне пожалуйста проект, попробую запустить у себя, может найду причину.
Мне ОЧЕНЬ нужно решить эту задачу.

Заранее благодарен
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39334462
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit1. Код отработал нормально как чисто консольное приложение на С++ или как dll вызванная из С#?
dll из c#
ArbitЯ прочитал на одном из форумов что манипуляции со строками COM как с обычными строками не прокатывают. Это особые строки.

читать COM строки можно как и обычные
выделение памяти - имеет особенности, отдельно можно обсудить
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39334478
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitЕсли у тебя все работает, скинь мне пожалуйста проект, попробую запустить у себя, может найду причину.
в 2015 студии, смотри
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39334666
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Спасибо большое, вечером буду изучать!
Отпишусь по результатам, но чуйка подсказывает, что дело в "мозгах и руках" :))
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39336676
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, добрый вечер!

Докладываю... :))
Перепробовал кучу комбинаций с кодом.
Задолбался конечно изрядно.

В сухом остатке - Пришлось установить Community 2015
Мой проект заработал только после конвертации в студию 2015
придется дальше писать на новой студии.
Так и не нашел где собака зарыта.

Но ты мне реально серьезно помог с прочисткой мозгов
Спасибо огромное!
Можно будет, при необходимости, еще побеспокоить?
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39336696
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArbitМожно будет, при необходимости, еще побеспокоить?
можно
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39337030
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил, добрый вечер!

Все равно у меня грабли ... моих мозгов не хватает, нагуглить не получилось...

- Твое консольное приложение Win32 работает нормально
- Мое консольное win32 созданное на моей студии 2015 тоже нормально (это копия твоего)
- Мое WindowsForm win32 приложение выдает исключение на 1 шаге функции GetWmiInfo:
"Failed to initialize COM library. Error code = 0x".

Мои потуги:

Мне необходимо получить множество параметров железа
Поэтому в функции GetStringID , я вызываю функцию GetWmiInfoс повторно
с разными значениями параметров.

Если только один вызов то в консольных приложениях все работает,
а если повторные вызовы, то вылетало исключение на 2 шаге в GetWmiInfo
"Set general COM security levels", так как COM уже инициализирован при первом вызове функции

Поэтому в функцию GetWmiInfo я добавил новый параметр int fl - флаг повторного вызова
После добавления параметра я получил нужный мне результат.

Но когда я перенес код с консольного приложения в WindowsForm
Код не хочет инициализировать COM уже на самом 1 шаге

DLL лежит в папке "C:\VC\Cont\Debug\Wlb.dll" твоего проекта
Все проекты ссылаются на эту же dll в этой же папке
Все проекты в архиве в папке VC

Может подскажешь? Две недели бьюсь
Понимаю что нет времени.
Но если появится - посмотри пожалуйста. Очень нужно

Спасибо за твою готовность помочь!
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39337033
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Да и еще:

WindowsForm я делаю на framework 3.5 так как
приложение должно работать начиная с Win XP? чтобы не напрягать
юзеров с установкой framework старших версий
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39337038
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как вложить архив?
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39337039
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

маршаллинг с тех пор не менялся, жить будет. Не забудь указать в свойствах проекта, что дотнет приложение в 32 бит режиме должно запускаться, чтоб не делать две версии c++ dll
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39337045
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Вот ссылка на архив с проектами на моем облаке
Загрузить на форум не получилось. так как размер больше допустимого

https://cloud.mail.ru/public/JGfc/57NPRsbzd
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39337046
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

Инициализацию COM делает рантайм дотнет. он жить без этого не может
просто выбрось все CoInitializeEx, CoInitializeSecurity, CoUninitialize()

коды ошибок COM анализировать полезно

если код ошибки поискать в гугле - первая же ссылка описывает проблему и решение -
http://stackoverflow.com/questions/5662382/why-does-com-coinitializesecurity-fail-in-my-dll
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39337136
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

... я даже и не знаю как тебя благодарить...

Я не мог предположить что в примере MSDN эти Co... нафиг не нужны!
Про коды ошибок я конечно притупил, учту непременно!
Не суди строго.
Я еще только учусь. Вот решил освоить новую профессию под занавес.
Хотя, какая разница что программировать... мозги или компьютер...
Принцип тот же, законы тоже, просто нужно выучить соответствующий язык! :))

Две недели... А какой я опыт и сколько нового узнал!
Спасибо огромное и РЕСПЕКТ!! !
...
Рейтинг: 0 / 0
15 сообщений из 40, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / _bstr_t преобразовать в строку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]