powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / _bstr_t преобразовать в строку
40 сообщений из 40, показаны все 2 страниц
_bstr_t преобразовать в строку
    #32477521
panza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имею переменную _bstr_t bstrStr. В неё залито какое то значение,типа"Hello,word!".

Как перелить это в С-строку (массив символов,заканчивающийся нулем)?
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32477555
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
_bstr_t Tmp = "Hello"; 
char* szTmp = new char[Tmp.length()+1];
strcpy(szTmp,(LPCSTR)Tmp);
fprintf(stderr,"%s\n",szTmp);
delete [] szTmp;
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32477569
panza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.

P.S.
(Тьфу,как все просто.)
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32477629
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(Тьфу,как все просто.)
_bstr_t это врапер для
BSTR т.е. это Unicode-строка - вы уверены что хотите ее в char* переделать? Можно ведь и в wchar_t*

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/_pluslang__bstr_t.asp

operator const wchar_t*( ) const throw( );

operator wchar_t*( ) const throw( );

operator const char*( ) const throw( _com_error );

operator char*( ) const throw( _com_error );

Remarks

These operators can be used to extract raw pointers to the encapsulated Unicode or multibyte BSTR object.
The operators return the pointer to the actual internal buffer, so the resulting string cannot be modified.


...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32477649
panza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
стоп,стоп,на самом деле мне нужно в unsigned char передавать
а там приведение типа
strcpy(szTmp,(LPCSTR)Tmp);//ругается на второй параметр

на самом деле у меня под new-массивы из unsigned char заделан довольно боьшой кусок проги и ковырять его очень не хотелось бы
??
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32477696
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
_bstr_t Tmp =  "Hello" ; 
unsigned char* szTmp = new unsigned char[Tmp.length()+ 1 ];
strcpy((char*)szTmp,(LPCSTR)Tmp);
fprintf(stderr, "\n%s\n" ,szTmp);
delete [] szTmp;
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32477733
panza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действительно,работает.
Спасибо,ZrenBy .
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32481750
panza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Н-н-нда-а, работает оно ,как же.
Компилится,то оно компилится,в вот при освобождении
памяти прога сваливается.

//////////////////
_bstr_t bstrStr;
unsigned char* p_ucValue;
int length;


bstrStr = "Hello";
length = bstrStr.length()+1;
p_ucFieldValue = new unsigned char(length);
strcpy((char*)p_ucValue,(LPCSTR)bstrStr);

delete []p_ucValue;//вылет
//////////////////////////////////

мне кажется что всё таки нельзя для strcpy втупую
приводить указатель на char к указателю на unsigned char
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32481771
panza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь,ошибся сам.

p_ucFieldValue = new unsigned char [ length ] ;
а не
p_ucFieldValue = new unsigned char ( length ) ;
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32481785
ZrenBy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще вариант

Код: plaintext
memcpy((LPVOID)szTmp,(LPVOID)(LPCSTR)Tmp,Tmp.length()+ 1 );
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #32483275
Alexandr Davydenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно и так:

Код: plaintext
1.
2.
3.
_bstr_t BodyData
DWORD nBodyDataSize = BodyData.length();
BYTE * pBody = new BYTE[nBodyDataSize];
wcstombs((char *)pBody, BodyData, nBodyDataSize);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
_bstr_t преобразовать в строку
    #39327257
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZrenBy
Код: sql
1.
2.
3.
4.
5.
_bstr_t Tmp = "Hello"; 
char* szTmp = new char[Tmp.length()+1];
strcpy(szTmp,(LPCSTR)Tmp);
fprintf(stderr,"%s\n",szTmp);
delete [] szTmp;



А у меня на строке:
strcpy(szTmp,(LPCSTR)Tmp);

VS2013 Выдает ошибку:
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

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

Вот этот макрос _CRT_SECURE_NO_WARNINGS определи в проекте (лучше всего), или если не знаешь, как,
напиши в первой строке исходного кода (каждого модуля, если их несколько).

Код: plaintext
1.
#define_CRT_SECURE_NO_WARNINGS



Когда вырастишь, и поймёшь, зачем это, макрос можно будет удалить.
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39328529
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv , спасибо за макрос!

Есть вопрос по обмену данными между С++ и С#
В разных способах результат один и тот же получаю
Наступил на грабли в приведении типов в соответствие
Чтобы не засорять тему можно в личку?

Спасибо

Модератор: чтобы не засорять тему, можно в новой теме. А "лички" на sql.ru никогда не было.
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39328538
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

с unicode сначала чуток разберись
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39330179
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZrenBy
Код: sql
1.
2.
3.
4.
5.
_bstr_t Tmp = "Hello"; 
char* szTmp = new char[Tmp.length()+1];
strcpy(szTmp,(LPCSTR)Tmp);
fprintf(stderr,"%s\n",szTmp);
delete [] szTmp;




тогда уж лучше так

Код: sql
1.
2.
3.
4.
_bstr_t Tmp = "Hello"; 
std::vector<char> szTmp( Tmp.length()+1 );
strcpy(&szTmp[0],(LPCSTR)Tmp);
fprintf(stderr,"%s\n",&szTmp[]);
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39333146
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые ГУРУ!
Помогите пожалуйста разобраться.

При использовании COM объекта (работа с WMI )
В качестве примера взял на сайте MSDN
https://msdn.microsoft.com/en-us/library/aa390423(v=vs.85).aspx
получаю результат - свойство объекта (строку с типом BSTR ). Строка содержит ожидаемое значение.
Сохраняю его в _bstr_t resValue.

Все это происходит в функции DLL (c++), которая получает параметром указатель на выделенный блок памяти
необходимого размера из С# wchar_t* pResult

Преобразовываю _bstr_t strBstr в wchar_t и записываю в выделенный блок памяти по переданному указателю.

В вызывающем коде на C# получаю исключение, из DLL передается NULL

А если я создам _bstr_t в ручную , (bstr_t strBstr = L"Test")
то на стороне С# получаю нужную строку


Подскажите пожалуйста на какие грабли я наступил.
И как правильно преобразовать _bstr_t в данном случае

Бьюсь уже неделю.
Передавал строку и используя строковый буфер StringBuilder

Пробовал передавать и непосредственно тип _bstr_t и в шарпе соответствующий код писал
Результат один и тот же:
"ручная" bstr_t строка передается, а bstr_t из COM объекта - нет, хотя при отладке pResult содержит данные

Заранее всем благодарен

С#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[DllImport(@"D:\\ProjectsC++\\DLL\\DLLPodolog\\Debug\\DLLPodolog.dll",
            EntryPoint = "GetSomeText",
            ExactSpelling = true,
            CharSet = CharSet.Unicode,
            CallingConvention = CallingConvention.Cdecl)]

public static extern int GetSomeText(IntPtr pComputerName);

var pComputerName = Marshal.AllocHGlobal(4096);
            GetSomeText(pComputerName);
            var str = Marshal.PtrToStringUni(pComputerName);
            Marshal.FreeHGlobal(pComputerName);



Вот такой вариант работает нормально
C++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
extern "C" __declspec(dllexport)  int GetSomeText(wchar_t* pResult)
{
	_bstr_t resValue = L"TestString";

	const size_t widesize = resValue.length() + 1;
	wcscpy_s(pResult, widesize, (wchar_t *)resValue);
	wcscat_s(pResult, widesize, L"\0");
};



А такой вариант дает исключение - NULL при передаче строки wchar_t* pResult
C++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
extern "C" __declspec(dllexport)  int GetSomeText(wchar_t* pResult)
{
	_bstr_t resValue;

// в resValue  функция GetStringID(resValue) возвращает нужную _bstr_t  строку (функция большая потому не привожу.
// но возвращает нужный результат - _bstr_t  строку из COM объекта 

	int result = GetStringID(resValue); 
	const size_t widesize = resValue.length() + 1;
	wcscpy_s(pResult, widesize, (wchar_t *)resValue);
	wcscat_s(pResult, widesize, L"\0");
};
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39333157
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit
Код: plaintext
1.
int result = GetStringID(resValue); 


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

Вот функция
int GetStringID(bstr_t & ID)
{
......
}
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39333171
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arbit,

ещё раз и целиком как в соседнем топике (в спойлер заверни, чтоб глаз не мозолила)
дьявол - в деталях
...
Рейтинг: 0 / 0
_bstr_t преобразовать в строку
    #39333441
Arbit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,
Я все оформил в класс, и как консольное приложение все работает, все строки присутствуют
Но как DLL, строки _bstr_t из COM не передаются

С#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[DllImport(@"D:\\ProjectsC++\\DLL\\DLLPodolog\\Debug\\DLLPodolog.dll",
            EntryPoint = "GetSomeText",
            ExactSpelling = true,
            CharSet = CharSet.Unicode,
            CallingConvention = CallingConvention.Cdecl)]

public static extern int GetSomeText(IntPtr pComputerName);

var pComputerName = Marshal.AllocHGlobal(4096);
            GetSomeText(pComputerName);
            var str = Marshal.PtrToStringUni(pComputerName);
            Marshal.FreeHGlobal(pComputerName);



C++
Сама функция в DLL
"C" __declspec(dllexport) int GetSomeText(wchar_t* pResult)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#pragma once
#include "HardWareData.h"



extern "C" __declspec(dllexport)  int GetSomeText(wchar_t* pResult)
{

	HardWareData objHW;
	_bstr_t resValue;
	int result = objHW.GetStringID(resValue);

	const size_t widesize = resValue.length() + 1;
	wcscpy_s(pResult, widesize, (wchar_t *)resValue);
	wcscat_s(pResult, widesize, L"\0");

	return 0;
};



HardWareData.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
#pragma once
#pragma comment(lib, "wbemuuid.lib")  //Библиотека для работы с WMI 
#define _WIN32_DCOM
#include <comdef.h>  //Для работы с COM  (типы параметров в методах класса)
#include <Wbemidl.h> // Для работы с WMI 
using namespace std;

class HardWareData
{
private:
	int GetWmiInfo(char[], wchar_t[], bstr_t &);

public:
	HardWareData();
	~HardWareData();
	int GetStringID(_bstr_t &);
};



HardWareData.cpp
Функция GetWmiInfo(char strSQL[], wchar_t NamePrt[], bstr_t & resValue)
Код: plaintext
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.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
#pragma once
#include "HardWareData.h"

HardWareData::HardWareData()
{
}

HardWareData::~HardWareData()
{
}
int HardWareData::GetWmiInfo(char strSQL[], wchar_t NamePrt[], bstr_t & resValue)
{
	HRESULT hres;
	// Step 1: Initialize COM ------------------------------------------
	hres = CoInitializeEx(0, COINIT_MULTITHREADED);
	if (FAILED(hres))
	{
		resValue = "Failed to initialize COM library. Error code = 0x";
		return 1;                  // Program has failed.
	}

	// Step 2: Set general COM security levels --------------------------
	hres = CoInitializeSecurity(
		NULL,
		-1,                          // COM authentication
		NULL,                        // Authentication services
		NULL,                        // Reserved
		RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication 
		RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
		NULL,                        // Authentication info
		EOAC_NONE,                   // Additional capabilities 
		NULL                         // Reserved
		);

	if (FAILED(hres))
	{
		resValue = "Failed to initialize security. Error code = 0x";
		CoUninitialize();
		return 1;                    // Program has failed.
	}

	// Step 3: Obtain the initial locator to WMI -------------------------
	IWbemLocator *pLoc = NULL;
	hres = CoCreateInstance(
		CLSID_WbemLocator,
		0,
		CLSCTX_INPROC_SERVER,
		IID_IWbemLocator, (LPVOID *)&pLoc);

	if (FAILED(hres))
	{
		resValue = "Failed to create IWbemLocator object. Err code = 0x";
		CoUninitialize();
		return 1;                 // Program has failed.
	}

	// Step 4: Connect to WMI through the IWbemLocator::ConnectServer method
	IWbemServices *pSvc = NULL;
	// Connect to the root\cimv2 namespace with the current user and obtain pointer pSvc to make IWbemServices calls.
	hres = pLoc->ConnectServer(
		_bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
		NULL,                    // User name. NULL = current user
		NULL,                    // User password. NULL = current
		0,                       // Locale. NULL indicates current
		NULL,                    // Security flags.
		0,                       // Authority (for example, Kerberos)
		0,                       // Context object 
		&pSvc                    // pointer to IWbemServices proxy
		);

	if (FAILED(hres))
	{
		resValue = "Could not connect. Error code = 0x";
		pLoc->Release();
		CoUninitialize();
		return 1;                // Program has failed.
	}
	resValue = "Connected to ROOT\\CIMV2 WMI namespace";

	// Step 5: Set security levels on the proxy -------------------------
	hres = CoSetProxyBlanket(
		pSvc,                        // Indicates the proxy to set
		RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
		RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
		NULL,                        // Server principal name 
		RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx 
		RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
		NULL,                        // client identity
		EOAC_NONE                    // proxy capabilities 
		);

	if (FAILED(hres))
	{
		resValue = "Could not set proxy blanket. Error code = 0x";
		pSvc->Release();
		pLoc->Release();
		CoUninitialize();
		return 1;               // Program has failed.
	}

	// Step 6: Use the IWbemServices pointer to make requests of WMI ----
	IEnumWbemClassObject* pEnumerator = NULL;
	hres = pSvc->ExecQuery(
		bstr_t("WQL"),
		//bstr_t("SELECT * FROM Win32_BaseBoard"),    //Серийный номер BaseBoard
		bstr_t(strSQL),
		WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
		NULL,
		&pEnumerator);

	if (FAILED(hres))
	{
		resValue = "Query for operating system name failed. Error code = 0x";
		pSvc->Release();
		pLoc->Release();
		CoUninitialize();
		return 1;               // Program has failed.
	}

	// Step 7: -------------------------------------------------
	// Get the data from the query in step 6 -------------------
	IWbemClassObject *pclsObj = NULL;
	ULONG uReturn = 0;

	while (pEnumerator)
	{
		HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
			&pclsObj, &uReturn);

		if (0 == uReturn)
		{
			break;
		}

		VARIANT vtProp;
		// Get the value of the Name property
		//hr = pclsObj->Get(NamePrt, 0, &vtProp, 0, 0)
		hr = pclsObj->Get(NamePrt, 0, &vtProp, 0, 0);  		//+vtProp	BSTR = 0x005205b4 L"PF05TBD8"	tagVARIANT
		resValue = vtProp.bstrVal;
		VariantClear(&vtProp);
		pclsObj->Release();
	}

	// Cleanup
	// ========
	pSvc->Release();
	pLoc->Release();
	pEnumerator->Release();

	CoUninitialize();

	return 0;   // Program successfully completed.
}


Функция GetStringID(bstr_t & ID)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int HardWareData::GetStringID(bstr_t & ID)
{	
	bstr_t resValue;
	//BaseBoard
	char strSQL1[] = "SELECT * FROM Win32_BaseBoard";
	wchar_t NamePrt1[] = L"SerialNumber";
	int result = GetWmiInfo(strSQL1, NamePrt1, resValue);
	bstr_t BaseBoard(resValue);



	ID = L"BaseBoard=" + BaseBoard;

	return 0;
}

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

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

Я благодарен за то что при всей занятости выделили на меня немного времени.
Меня сбила с толку фраза: "в спойлер заверни, чтоб глаз не мозолила", подумал что надоедаю. :)

Я благодарен за любую помощь и ценный совет:)
...
Рейтинг: 0 / 0
_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
40 сообщений из 40, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / _bstr_t преобразовать в строку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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