問題タブ [marshalling]

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.

0 投票する
3 に答える
3909 参照

c# - StructLayout を明示的に指定する必要があるのはいつですか?

私は C# からの DLL の呼び出しをいじっていて、独自の構造体を定義する必要があることに気づきました。多くの記事では、構造体の順次レイアウトを強制しています

それで、私はスイートに従いました、そして私のプログラムはうまくいきました。今、私がラインを取り出したとき、それはまだ機能しています。なぜそれが必要なのですか?

0 投票する
3 に答える
2432 参照

.net - .NET マーシャリング速度

次のような C++ メソッド シグネチャがあります。

内部と外部の両方のタイミング メソッドで関数をラップしました。内部的には、関数は 0.24 秒で実行されています。外部的には、関数は 2.8 秒で実行され、約 12 倍遅くなります。どうしたの?マーシャリングは私をそんなに遅くしていますか?もしそうなら、どうすればそれを回避できますか?安全でないコードに移動して、ポインターなどを使用する必要がありますか? 余分な時間のコストがどこから来ているのか、私はちょっと当惑しています。

0 投票する
3 に答える
648 参照

c# - C#アプリケーションからアンマネージ(COMではない)dllを呼び出す方法はありますか?

C#アプリケーションでアンマネージC ++(COMライブラリではない)で記述されたDLLを使用(参照)する方法はありますか?

Visual Studio内から参照しようとすると、「COMオブジェクトではありません」というエラーメッセージが表示されます。

たぶん、DLL参照をCOM化するある種のtranslator \ routerがありますか?COMとCOMの相互運用機能がどのように機能するかはわかりません。プログラミングを開始したのは、これがすでに不要だったからです。

ありがとうございました。

0 投票する
2 に答える
5278 参照

c# - アンマネージ コードで Marshal.PtrToStructure を介してマーシャリングされた構造を削除する必要がありますか?

私はこのC++コードを持っています:

次に、C# で次のように関数を呼び出します。

MyDataStructure は MY_DATA_STRUCTURE に対応する構造体 (クラスではない) であり、メンバーは適切にマーシャリングされます。

質問: pData を保存してから、MyDataStructure が GC されたときにアンマネージ コードで再度解放する必要がありますか? MSDN は、Marshal.PtrToStructure(IntPtr, Type) について次のように述べています。その文の「マーシャル」は「コピー」を意味しますか? その場合、(IntPtr pData) を保持し、それを (MyDataStructure デストラクタ内の) アンマネージ コードに渡して、C++ の「削除」を実行できるようにする必要がありますか?

検索しましたが、これに対する十分に明確な答えを見つけることができません。

0 投票する
4 に答える
1327 参照

c# - アンマネージド/マネージド相互運用 - int[] を渡す際の問題

私は化学の博士号を取得しようとしています。そのため、顕微鏡下でのサンプルのイメージングに役立つソフトウェア アプリケーションを作成する必要があります。この顕微鏡には、xyz ナノポジショニング ステージが取り付けられています。ステージは、ハードウェア ベンダーによって VC++ で記述されたアンマネージ DLL を使用して制御されます。必要なものの詳細を提供できますが、まずはこれから始めましょう。

dll のメソッドの 1 つを使用すると、運動軸の設定を読み取ることができます。

C++ 構文:

BOOL は、規則に従って int 0 または 1 です。

私のC#ラッパーには以下が含まれています:

これは私には正しいようです。ただし、メインアプリケーションで次のようなことを試すと(軸1、2、および3を照会するため):

私は一貫して次のような配列を取得します:

{6, 0, 10} ですが、デバイス自体の表示に従って {0, 0 , 0} を取得する必要があります。補完機能:

BOOL E7XX_SVO (int ID, const char* szAxes, const BOOL* pbValueArray)ステージに同じステータスビットを設定することもできません...

dll の他のコマンドは完全に機能します。問題なく文字列とダブルスを出し入れできますが、BOOL型は受け渡しできません...

何が悪いのか分かりますか?

0 投票する
1 に答える
3587 参照

c# - C# でパックされた構造体のアンマネージド バッファーをマーシャリングする方法

次の pinvoke シグネチャを使用して、C# で Windows FilterSendMessage 関数を (正常に) 呼び出しています。

outBufferパラメーターには、C で次のように定義された任意の数の構造体 (次々にパック) が取り込まれます。

nameフィールドには、可変長のヌル終了 Unicode 文字列が割り当てられます。lenフィールドは、構造体の合計サイズ (名前文字列を含む) をバイト単位で示します。管理されていない側で構造体がどのように処理されているかについては、何も問題はないと確信しています。

c# で次のように定義されている BAH_RECORD 構造体のインスタンスに outBuffer をマーシャリングしようとすると、私の問題が発生します。

bah.name を印刷/表示/表示しようとすると、ゴミが表示されます...

outBuffer に実際に有効なデータが含まれていることを確認するために、C# で大雑把なポインター ハッカーを実行して、Marshal.ReadInt32 を 2 回呼び出し (最初の 2 つの構造体フィールドをカバーするため)、次に Marshal.ReadByte を数回呼び出してバイトを入力しました。 [] を Encoding.Unicode.GetString() の引数として使用します...文字列は正常に出力されるので、間違いなくそこにあるので、マーシャラーに正しく処理させることができないようです (できる?)

どんな助けでも大歓迎

スティーブ

0 投票する
3 に答える
4723 参照

c++ - インターフェイスポインタをスレッドに渡す方法は?

ノート:

  • 生の Win32 CreateTard() APIの使用
  • MFCなし
  • インターフェイスは単に vtable へのポインタです

質問:

  • インターフェイスポインタをスレッドに渡す方法は?

図:

よろしく

0 投票する
3 に答える
995 参照

c# - C++ CLI の暗号関数呼び出し

そこで、OCX オブジェクトのマネージド ラッパーである関数を呼び出そうとしています。大きな困難を抱えています。機能は次のとおりです。

ここで、「theBuffer」はバイト配列です。「foo」がラップするアンマネージド OCX のテンプレートは次のとおりです。

だから私は試しました。

これは失敗します。と

これはコンパイルされますが、明らかに呼び出された関数は.NETビットマップを作成しません。

したがって、問題は、この関数に書き込み可能なメモリ ブロックを渡し、.NET の世界でアクセスできるようにする方法だと思います。

ありがとう

0 投票する
1 に答える
1251 参照

c# - アンマネージ Unicode 文字列から SecureString を作成する

CryptUnprotectData Windows API 関数と .net SecureString を可能な限り最善の方法で結び付けたいと考えています。CryptUnprotectData は、バイト配列とバイト長で構成される DATA_BLOB 構造を返します。私のプログラムでは、これは Unicode UTF-16 文字列になります。SecureString には、char* と長さのパラメーターを受け取るコンストラクターがあるため、次のようなことができるようにしたいと考えています。

これは機能しますが、UTF-16 が可変長であることを除けば、長さの引数として何を使用すればよいかわかりません。上記の例では 2 バイト文字 (BMP) を想定していますが、他のプレーンでは最大 4 バイトになる可能性があります。バイト配列内の UTF-16 文字の数を知る必要があります。値をメモリ内にコピーせずにこれを行う最善の方法は何ですか (それによってセキュリティが損なわれます)。できるだけ早くバイト配列をゼロにして解放する予定です。

0 投票する
4 に答える
86192 参照

c++ - C++ でオブジェクトをどのようにシリアル化しますか?

シリアル化してソケット接続を介して送信する必要があるオブジェクトの小さな階層があります。オブジェクトをシリアライズしてから、オブジェクトのタイプに基づいてデシリアライズする必要があります。C++ でこれを行う簡単な方法はありますか (Java にあるように)。

C++ シリアル化のオンライン コード サンプルまたはチュートリアルはありますか?

EDIT:明確にするために、オブジェクトをバイト配列に変換してからオブジェクトに戻す方法を探しています。ソケット送信はできます。