問題タブ [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.
mfc - 関数から返されたマングルされた LPCTSTR 文字列
AとBの2つのプロジェクトがあります
プロジェクト A は次のようにコンパイルされます
。 1. 標準 Windows ライブラリ
2. マルチバイト文字セット
3. 共通言語サポート なし
プロジェクト B は次のようにコンパイルされます
。 1. 動的 dll としての MFC
2. マルチバイト文字セット
3. WITH を使用した共通言語サポート
プロジェクト A では、次の関数が定義されています。
}
次を使用してプロジェクト B から呼び出されます。
ただし、ドライバー名が呼び出されると、「名前」の内容はゴミです
c++ - wchar_t*からBSTRへの受け渡しを検出するための静的コード分析
aBSTR
はコードベースのaにすぎないtypedef
ためwchar_t*
、文字列リテラルがメソッドに渡される場所がいくつか(多く?)あります。BSTR
これは、マーシャラーや特定のメソッドを使用しようとする人BSTR
(たとえばSysStringLen
)を混乱させる可能性があります。
このタイプの誤用を静的に検出する方法はありますか?
/Wall
VC10と静的コード分析のMicrosoftAllRulesを使用してコンパイルしようとしましたが、次の問題のあるコードはどちらからもフラグが付けられません。
更新:wtypes.h
私が諦めたこれらの種類の違反を検出するために破壊しようとした後。
2つのパスを試しましたが、どちらも上記のサンプルプログラムで作業することができましたが、実際のプロジェクトを試すと失敗しました。
- 名前の付いたクラスを作成します
BSTR
が、はユニオンメンバーとしてをVARIANT
持っているBSTR
ため、新しいクラスにはコンストラクターや代入演算子を含めることができませんでした。これはすべての場所で壊れ、NULL
として扱われましたBSTR
。変換演算子を持つ型に置き換えようとしましNULL
たが、数十の新しい演算子(比較、変換など)を追加した後、あいまいな呼び出しに遭遇し、あきらめました。 - 次に、@ CashCowと@Hansによって提案された方法を試しました(
BSTR
別typedef
のタイプのポインターを作成します)。これも機能しませんでした。メソッドを追加toBSTR
し、comutil.h()やその他の場所を変換して散らかした後、コンパイラがIDLから生成されたヘッダーをチョークするようになりました(デフォルト値はリテラル幅の文字列に変換されます)。fromBSTR
_bstr_t
要するに、私は自分でこれを達成しようとすることをあきらめました。誰かがそれについて聞くのを助けることができるコード分析ツールを知っているなら、私はそれについて聞いてとてもうれしいです。
visual-c++ - :: SysFreeString()を使用してBSTRを解放します。より多くのプラットフォームに依存しますか?
私はたくさんのインターフェースとメソッドを備えたCOMサーバーを書いています。また、ほとんどのメソッドには、パラメーターとして、および戻りに使用されるローカルパラメーターとしてBSTRがあります。スニペットは次のようになります
アップデート5:
実際のコード。これは、特定の条件に基づいてデータの束からフェッチし、DBがオブジェクトの配列にデータを入力します。
問題はメモリ解放の部分にあります。コードはどのWinXPマシンでも非常に正常に機能しますが、WIN2K8 R2およびWIN7になると、コードがクラッシュし、:: SysFreeString()が原因として示されます。MSDNはソリューションに十分ではありません。
誰かが正しい解決策を見つけるのを手伝ってもらえますか?
よろしくお願いします:)
アップデート1:
生のBSTRの代わりに提案に従ってCComBSTRを使用してみましたが、直接CStringを使用して初期化され、SysFreeString()が除外されました。しかし、私の問題のために、スコープから外れると、システムはSysFreeString()を呼び出し、これが再びクラッシュを引き起こします:(
更新2: SysAllocString()を使用して割り当てようとした同じCComBSTRで、問題は同じままです:(
更新3: 私はすべてのオプションにうんざりしていて、安心して質問だけを念頭に置いています
SysAllocString()/ string.AllocSysString()を使用して割り当てられたSysFreeString()を介してBSTRを解放する必要がありますか?
更新4: クラッシュに関する情報を提供できませんでした。COMサーバーをデバッグしようとすると、次のようなエラーでクラッシュしました
「ヒープの破損の可能性」
。ここから私を助けてください..:(
c++ - :: SysFreeString()がWINDOWS2008でのみクラッシュする
BSTRを使用するCOMコードがあります。
:: SysFreeString()を使用するとアプリケーションがクラッシュするという点で
ただし、WINDOWS2003、WIN7、WINXPなどでも同じことが機能します。
何が問題を引き起こしているのか、何が間違っているのかについての考え。サンプルコードは以下の通りです
c++ - c++でNULL文字が埋め込まれたBSTRを構築するにはどうすればよいですか?
NULL 文字が埋め込まれた BSTR を構築するにはどうすればよいですか?
c - C で MacOSX 上の BSTR を処理する
MacOSX dylib から VBA から C コードが呼び出されたときに、VBA から渡された文字列を変換するための C でいくつかのコードを作成しました。ここでいくつかの良いヒントを得ました。私は ASCII 文字列しか気にしないのでBSTR
、単純なに変換する次の関数を作成しましたchar*
。
myheader.h は次のようになります。
. uint16_t
MacOSX C コンパイラの 4 バイト (2 バイトではない) wchar_t のために使用しました。vbstochar
の内容を見るために を呼び出した後にブレークポイントを追加しましたがconvarg
、Excel から呼び出すと動作するようです。
これはうまくいきますが、私が理解していないことの1つはlen
、vbstrlen
関数内で2を掛ける必要がある理由です。私はCに慣れていないので、ポインタについて少し読む必要がありました. 2 バイト文字が含まれている場合、2 を掛けずに正しい文字列の長さを取得する必要がありますか? 誰かが私にこれを説明したり、チュートリアルへのリンクを投稿したりできれば素晴らしいと思いますか?
また、文字列引数を持つ関数は、VBA で呼び出されたときに機能しますが、最初の呼び出しの後でのみ機能します。BSTR*
そのため、最初に dylib から引数を指定して関数を呼び出すと(アプリケーション、この場合は Excel を起動した後)、BSTR*
ポインターは特定の (ランダムな?) アドレスを指すだけで、文字列は指しません。VBA から関数を 2 度目に呼び出すと、すべてが正常に機能します。
c++ - アラビア語テキストの BSTR から CString への変換
私の VC++ (VS2008) プロジェクトは、マルチバイト文字セットを使用しています。
日付文字列を COleDateTime に変換する次のコードがあります
このコードはすべての地域設定でうまく機能しますが、入力日付が次の形式のアラビア語地域設定では失敗します: 21/05/2012 11:50:31م
変換後、CString にジャンク文字が含まれ、解析が失敗します: 01/05/2012 11:50:28ã
アラビア語の設定で機能する BSTR から CString への変換はありますか?
c++ - ネイティブ文字列で (_bstr_t ラッパーを使用して) BSTR を作成するときに、長さを設定するにはどうすればよいですか?
BSTR
(ラッパークラスとして使用して)を作成するとき、のコンストラクターの_bstr_t
いくつかを使用する必要があります。aはヌル文字を含む可能性のある長さのプレフィックス付き文字列であるため、指定されたネイティブ文字列のヌル終了に依存することなく、ネイティブ文字列を使用してそのような文字列を作成する可能性がなければなりません。_bstr_t
BSTR
例を挙げると:
問題は、コンストラクターが のヌル終了に依存していることですpwNativeString
。したがって、結果BSTR
は公正であり、それ以上のものでは"abc"
ありません。だから私の質問は次のとおりです:特定の長さの配列へのポインタを作成して配信する方法BSTR
は? _bstr_t
次の疑似コードの例では:
c - C: int から _bstr_t
cを使用してExcelで一連のプロットを描画しようとしています。問題は、プロットの作成をループに入れようとすると、Excel でワークシートの名前を変更する必要があることです。ただし、これらの名前は _bstr_t 形式です。
名前を ("シート番号 %d",i) のようにしたいのですが、ここで i はカウンターです。私は sprintf と他の方法を使ってみましたが、うまくいきませんでした。
どんな助けでも大歓迎です!
c++ - BSTR を std::vector に格納しますか?
BSTR を in パラメーターとして受け取る ATL COM コンポーネント メソッドがあります。このメソッドへの各呼び出しを配列に追加する必要があります。SAFEARRAY は固定サイズであるため使用できないため、std::vector が最も簡単な選択になると考えていました。もちろん、ベクターに追加するたびに SysAllocString を呼び出す必要があります。これは、ベクトルが破棄される前に各エントリに対して SysFreeString を呼び出す必要があることを意味します。
私はより簡単でクリーンなソリューションを探していて、ベクターを vector<_bstr_t> として宣言することを考えていました。これには自動クリーンアップが含まれます。しかし、私の頭の片隅にあるのは、事実上スマート ポインターを標準のコンテナーに保持することに警鐘を鳴らしていることです。私の心配は正当化されますか、それとも安全にこれを行うことができますか? そうでない場合、他のより良い解決策はありますか?