問題タブ [bstr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - BSTR を使用する理由と、それを QString に変換する方法
関数が BSTR を返す Microsoft Kinect SDK を使用しています。QString または std::string を取得する必要があります。
これが私が試したことです:
この解決策では、プログラムがクラッシュします。コメントアウトされた行で、「未解決の外部シンボル SysStringLen」が表示されます。
SysStringLen を使用する方法はありますが、追加のライブラリを追加する必要があります (API にはまだ含まれていません)、または別の解決策はありますか?
追加の質問: Microsoft はなぜそれを行うのですか? つまり:
このようなものの背後にある理由は何ですか? また、内部的に使用することが有益であるとわかったとしても、API で通常の char 配列または std::(w)string を使用して、他の人の生活を楽にすることはできませんか?
c++ - C ++ stlマップ:BSTRの問題
コード<BSTR,struct>
bstrでマップをキーとして使用し、値を構造化します。
これは機能しますか、それとも何かを再定義する必要がありますか?
コンパイルの問題は見られず、要素を追加することもできます。ただし、map.find()
動作しません。要素が存在していても、常に戻りますmap.end()
(要素が見つかりません)。
次のように一時的な回避策を実行しました-からmap.begin()
にループしmap.end()
、各要素に対してlstrcmpWを実行します。これはうまくいくようですが、これが効率的すぎるとは思わないでください。
何が間違っている可能性があるかについての提案/ヒントはありますか?BSTR
地図の鍵として使っても大丈夫ですか?マップが非ネイティブデータ型の一部をサポートしていないことを知っています-構造体またはクラス...uは<
そのための演算子を定義する必要があります。
char - _bstr_tからchar*、驚くべき結果
最初:
2番目:
それらは同じですが、最初の条件は読み取り不可能なコードを引き起こします
なぜ?
c# - COMコンポーネントからBSTR*を渡そうとしたときのC#のMarshlDirectiveException
このようなものでCOMメソッドを呼び出すと
上記のエラーが発生します。呼び出されるメソッドは次のようなものです
BSTR *に値を割り当てない限り、正常に機能します。
編集:IDLの説明
EDIT2:* returnme = "T"のように1文字だけ渡す限り、正常に機能します。しかし、文字列である必要がある場合は、文字列にポインタを割り当ててもエラーが発生します。
c++ - _Type :: get_FullNameによって入力されたBSTRを解放する必要がありますか?
私はこのように見えるいくつかのコードを持っています:
そのbstrを解放する必要がありますか?SysFreeString()を解放するにはどうすればよいですか?そうでない場合はなぜですか?
c++ - VARIANT / bstrVal コードによる C++ リーク
リーク チェッカーは、次のコードで割り当てられているメモリにメモリ リークがあることを示しています。
そこにある「clsObj」は、WMI 用の Microsoft インターフェイスである IWbemClassObject です。
リークしたメモリを割り当てる特定の行は、「clsObj->Get」行です。次に、リーク チェッカーは、ソース コードを持っていないリーク自体のより具体的なコードを報告します (つまり、リークしたメモリの割り当て時のスタック トレース内)。
そのため、VARIANT vVal の基になる BSTR がリークされているようです。しかし、私は VariantClear を行っています...他に何かする必要がありますか?
おそらく、wstringコンストラクターでリークしていますか?でも、もしそうなら、私にはわかりません。私は、bstrVal は基本的に char ポインター (または wchar など) に要約されると考えました。wstring コンストラクターは、他のポインターであるかのように、そのアドレスからコピーする必要がありますよね?
wstring コンストラクターが vVal.bstrVal によって最初に指されたメモリをクリアする責任を引き継ぐようなものではありません。参照カウントされた COM オブジェクトに対して Detach() を実行しているかのようです。
重要な場合、これは Visual C++ 6 にあります。
c++ - _bstr_t クラスを使用して、Windows でマルチバイトと Unicode を変換できますか? (C++)
BSTR
COM関数など、いくつかの特定の用途を持つこの奇妙なWindowsデータ型です。MSDN によると、これにはWCHAR
文字列と、長さ記述子などのその他の要素が含まれています。Windows は、カプセル化された_bstr_t
クラスを提供してくれますBSTR
。割り当てと割り当て解除を処理し、いくつかの追加機能を提供します。これには、 を受け取るコンストラクタと を受け取るコンストラクタを含む4 つのコンストラクタchar*
がありwchar_t*
ます。前者についての MSDN の説明: 「_bstr_t
呼び出しSysAllocString
て新しいBSTR
オブジェクトを作成し、それをカプセル化することによってオブジェクトを構築します。このコンストラクターは、最初にマルチバイトから Unicode への変換を実行します。」
また、文字列へのポインターを 、 、 のいずれかとして抽出できる演算子もあり、それらがヌルで終了していることは確かです。これはすばらしいことです。char*
const char*
wchar_t*
マルチバイトと Unicode の間で変換する方法について、しばらく読んでみました。また、エンコーディングが異なる可能性があるため、 and の使用方法mbstowcs
とwcstomb
、 andMultiByteToWideChar
のほうが優れていることについての多くの話を見てきました。WideCharToMultiByte
それはすべて頭痛の種のように思えるので、を構築して操作を使用して文字列にアクセスできるかどうか疑問に思ってい_bstr_t
ます。
これに対する私の直感的な答えは、Windowsが舞台裏で何をしているのかわからないということだと思います。そのため、 / ではなく / (私は本当に / を意味していると思います) の使用に問題がある場合、リスクをmbstowcs
冒すwcstomb
べきmbstowcs_s
ではありません。 Windowsがそれらを使用する可能性があります。(ここでは「コードページ」を指定していないので、後者を使用していないことはほぼ確実です.さまざまなエンコーディングなどのすべてを実際に把握していますが、それはまったく別の質問であり、インターネット全体で対処されているようです.wcstomb_s
MultiByteToWideChar
WideCharToMultiByte
mbstowcs_s
wcstomb_s
すっごく、その潜在的な懸念は別として、これを行うことに何か問題はありますか?
c++ - BSTR を char に変換する際の問題 *
WinHttp.WinHttpRequest.5.1 を使用して、サードパーティの Web サービスを呼び出す古い C++ アプリがあります。
問題とは関係ないと思うので、呼び出しシーケンスのすべての詳細をリストすることはしませんが、BSTR 型の を呼び出して終了しhr = pIWinHttpRequest->get_ResponseText(&bstrResponse);
ますbstrResponse
。
呼び出しコードは BSTR では機能せず、標準の C/C++ で機能するため、コードは BSTR をwithchar *
に変換します。char *
そして、このコードでアクセスした以前のすべての Web サービスで、これは機能しました。しかし、この新しいものはそうではありません。
返されるデータは XML であるはずですが、この 1 つの Web サービスについては、文字コード変換の問題が発生しているようです。結果の文字列は次で始まります。"?<?xml version="1.0" encoding="utf-8"?>..."
?
冒頭の余分に注意してください。これをデバッガでbstrResponse
見ていくと、 の表示値には表示されず、 の表示値にも表示されませんが、b
の表示値には表示されますc
。
何が起こっているのかについてのアイデアはありますか?
編集済み
BSTR がマルチバイト型であることは理解していますが、この文字列のすべての文字はプレーン ASCII であり、この関数を呼び出すコードはマルチバイト文字を処理できません。Web をブラウジングすると、この特定のメカニズムが推奨されることがよくありますが、この場合は機能しません。
この文字列を BSTR から 1 バイト文字の配列に変換する必要があります。それが変換できないマルチバイト文字を取り除くことを意味するとしても。
c++ - MSXML メソッドは BSTR パラメータのメモリ所有権を取得しますか?
MSXML メソッドは BSTR パラメータのメモリ所有権を取得しますか?
例: load
、getElementsByTagName
、またはselectSingleNode
私がこれを尋ねているCString
のは、単純に を呼び出しAllocSysString()
て、それを MSXML メソッドに渡し、後で呼び出さずに渡すコードを見たからSysFreeString()
です。
編集:
私が使用して見たコードのクイック修正_bstr_t
: https://stackoverflow.com/a/14471409/109747 (私の投稿)