問題タブ [pin-ptr]
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.
performance - pin_ptr performance relative to native (VC) heap objects
In a C# to native lib CLI/C++ wrapper, I have a choice:
- Store native pointer in a managed class (native object is created using native "new")
or
- Store native object as a data blob in a managed class' field, and use
pin_ptr
to pin it before each native use.
Has anyone done any comparative analysis on the relative performance costs of the two paths?
Thanks!
list - pin_ptr を汎用リストに入れる方法は?
String^ のリストをパラメーターとして受け取るマネージ C++ メソッドがあります。
このメソッドは、String^ 内のメモリへのポインターを使用してアンマネージ構造体を設定する必要があります。
WCHAR* の抽出は、PtrToStringChars で十分に簡単です
ただし、設計時に割り当てる pin_ptr の数がわかりません
以下のようなもので、固定されたptrをリストに追加したいと思います List< pin_ptr< const wchar_t>>
これを行うと、エラー C3225 が生成されます: 'T' のジェネリック型引数は 'cli::pin_ptr' にすることはできません。値型または参照へのハンドルでなければなりません
これを行う方法はありますか?マネージ C++ で
string - リテラル文字列を渡すには pin_ptr が必要ですか?
マネージ C++ 関数から、'const char *' を引数として期待するアンマネージ関数を呼び出したいと考えています。
以下の a) と b) は正しいですか?b) の場合、pin_ptr 'hello' が必要ですか? a)はどうですか?ありがとう。
a)
myFunction( "hello" );
b)
memory - pin_ptrネイティブvoid*ヘルプ
セットアップ
以下に定義されているネイティブ関数を持つPDFAPIがあります。
C ++ / CLIラッパー関数で上記のコードを呼び出すと、正しい文字列が返されますが、PDF_CloseDocを呼び出すとAccessViolationExceptionがスローされます。WOOPS。ドキュメントのポインタをpin_ptrするのを忘れました。
問題
pin_ptr pdocを実行すると、これらのネイティブ関数を正常に呼び出すことができますが、PDF_GetMetaTextが返されるときに、バッファに文字列が含まれなくなります。
また、buffer [0]を固定しようとしましたが、GetMetaTextでアクセス違反の例外が発生します。
質問
GetMetaTextで何が起こっているのかわからないので、pdocに何が起こっているのかわかりません。上記のコードに対する提案はありますか?
visual-c++ - vc++ の pin_ptr と interior_ptr
私は、Visual C++ 2008 で以前働いていた人によって書かれたプロジェクト (STM32 の HID インターフェイス) に取り組んでいます。そのため、問題を引き起こしている行を模倣するために、VC++ 2008 でサンプルの winform アプリケーションを作成しました。この 1 行のクリック イベントでは、x64 用にビルドされた場合にのみビルド エラーが発生しますが、win32 ビルドではビルド エラーは発生せず、正常に動作します。
x64 ビルドでのみ表示されるビルド エラーは次のとおりです。
ありがとう。
c++-cli - pin_ptr使用時のアクセス違反?
ネイティブ C コードで pin_ptr を使用して配列を渡すと、アクセス違反が発生します。コードは次のとおりです。
このコードを変更して、新しいスペースを割り当てて元の配列をそれにコピーすると、アクセス違反が発生しなくなりました。新しいコード:
質問: pin_ptr からの使用に問題はありますか?
pointers - interior_ptr の問題 pin_ptr
cli/c++ ref クラスを構築しようとしています。このクラスの目的は、ネイティブ クラス ポインターを何らかの機能でラップすることです。ネイティブ クラス ポインタは、ブラック ボックス ファクトリ メソッドによって提供されます。私の人生では、ネイティブポインターを固定して動かないようにする方法がわかりません。これがコードのシナリオです(いわば):
エラー C2440: '=' : 'cli::pin_ptr' から 'NativeFooClass*' に変換できません
コンパイラはそれらを同じように扱うと思いましたか?静的キャストする必要がありますか? それは正しくないようです???
このポインターを固定しようとしている理由は、メソッドで使用しようとして C# からこのメソッドを呼び出そうとすると、AccessViolation ランタイム エラー "{"Attempted to read or write protected memory. これは多くの場合、他のメモリが破損していることを示しています。"}"
string - pin_ptr & PtrToStringChars vs. StringToHGlobalAnsi: PtrToStringChars var がその値を失うのはなぜですか?
WNetAddConnection2
C++/CLI を使用しており、Windows ネットワークから関数を呼び出したいと考えています。
まず、C++/CLI が自分の仕事に適した言語ではないことはわかっていますが、今のところそれを変更する可能性はなく、代わりに C# を使用しています。
問題は、この関数が wchar_t* を受け取るため、System::String^ を wchar_t* に変換する必要があることです。
解決策 1): を使用pin_ptr
しPtrToSTringChars
、vcclr.h
解決策 2) から: を使用しますStringToHGlobalUni
。(タイトルはStringHToGlobalAnsi
、より多くの人がそれを検索しているため、この投稿を見つけて回答が早くなる可能性があることを示しています)。
両方のソリューションが機能することがわかりました。しかし、#1はそうではありません。CWNetShare
次のコンストラクターを使用 して、WNet 関数を ref クラスに入れました。
はタイプm_wszLocalDrive
のプライベートCWNetShare
メンバーですwchar_t*
。
本当の問題: m_oWNetShare = gcnew CWNetShare
Winform クラス コンストラクター (C++/CLI と Winforms...) からコンストラクターを呼び出している間、すべて問題ないようです。文字列i_sLocalDrive
などが変換され、正しく割り当てられます。ただし、m_oWNetShare
後でアクセスすると、すべての m_wsz... 変数の値が失われます。オブジェクトが GC によって移動されたようです。
したがって、私はテストを行いました:
再び、コンストラクターに含まれる winformm_oManaged = gcnew CManaged;
です。後で m_oManaged にアクセスする場合、m_oManaged が移動されていなければ問題ありませんm_wszPinned
。
しかし、GCした後、それはナンセンスを示しています。しかし、 m_wsznothing はその値を保持するため、問題でwchar_t*
はなく、 pin_ptr の問題です。のアドレスm_oManaged
は変更されましたが、 のアドレスはm_wszPinned
同じであるのに、値が失われるのはなぜですか?
ここで何がうまくいかないのですか?
それでは、 pin_ptr と PtrToSTringChars には用途がありますか?
私は今、マーシャリングを使用しています。
c++-cli - cli::配列混合クラスのメンバーとして
混合クラスのメンバーとしてマネージ バッファーが必要です。
これにより、次の結果が得られます。
エラー C3265: アンマネージド 'A' でマネージド 'm_managedBuffer' を宣言できません
だから私は auto_gcroot を使ってみました:
そして、次のエラーが発生しました:
エラー C2106: '=': 左オペランドは左辺値でなければなりません
私の解決策は、管理されたラッパーを使用することです
私はこれが好きではありません。これは、実際のバッファーに到達するための間接的なレベルを導入するためです。さらに、マネージ バッファー (pin_ptr) を固定したい場合 - どうすればよいですか? 外側の ByteArray オブジェクトを固定せずに、内側の m_bytes メンバーだけを固定できますか?
解決策: auto_gcroot の代わりに gcroot を使用します。管理されたバイト配列は GC によってクリーンアップされます。auto_gcroot の下にある必要はありません。