問題タブ [intptr]
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# - API呼び出しのSafeProcessHandleとIntPtrの違い
WinAPIを使用しているときに、C#アプリケーションにGetProcessAfinityMaskの呼び出しを実装することにしました。ただし、この関数には2つの異なるシグネチャがあります。
それらの1つはSafeProcessHandle
ハンドルに使用します:
他の可能なバージョン(P / Invoke)は以下を使用しますIntPtr
:
両方の関数が同じ値を返すとすると、インスタンスを渡すことと、SafeProcessHandle
インスタンスを渡すことの違いは何IntPtr
ですか?
c# - XmlSerializer を使用して IntPtr をシリアル化する
なぜ IntPtr 型が XmlSerializer 実装でサポートされていないのか疑問に思っています。IntPtr 型のフィールドを含むクラスをシリアル化しようとすると、IntPtr がサポートされていないというメッセージが表示されてシリアル化が失敗し、そのメンバーは無視されます。
これを回避するには、IntPtr 値を Int64 に変換します... しかし、それは良い考えですか? 私が考える限り、そうあるべきです。具体的には、.NET フレームワークで IntPtr と入力されるウィンドウ ハンドルをシリアル化する必要があります。私は正しいことをしていますか?
c# - Windows メッセージでの IntPtr から String への変換
ウィンドウメッセージをフックして困っています。ウィンドウのテキスト (キャプション) の変更を検出する必要があるため、対象のウィンドウの WM_SETTEXT メッセージをインターセプトします (ウィンドウの作成時にウィンドウのキャプションが指定されていないため、これを行います)。
WM_SETTEXTドキュメントのドキュメントを読むと、 lParamパラメータはウィンドウ テキストを表す文字列へのポインタを指定します。
メッセージは、SendMessage を使用して .NET アプリケーションに転送されます。.NET アプリケーションで行うことは次のとおりです。
ここで、ProcessMessage は、.NET フォームのメッセージを処理するルーチンです。
私がいつも得るのは空の文字列です。これは期待される結果ではありません。他の Marshal.PtrToString* メソッドを試しましたが、誰も機能しませんでした。
IntPtrからStringへの変換で何が間違っていますか?
(*) すべての Windows メッセージが傍受されるため、システム全体がブロックされるため、このコードをデバッグできないことに注意してください。
c# - 管理対象外から管理対象へのconstchar*文字列の受け渡し
2つの通信コンポーネントがあります。1つは管理対象、もう1つは管理対象外です。管理対象は、管理対象外の実装から文字列(同じ文字列または単なるコピー)を取得する必要があります。次のコードを試しました。
ただし、testStrの値は期待どおりではありません。私がここで間違っていることを誰かが知っていますか?どんな提案も本当に役に立ちます。
c++ - エラー:「Foo*」から「unsignedint」へのキャストは精度を失います
int(またはunsigned int)へのポインターをキャストしようとしていますが、何を試しても機能しません。
、、およびCスタイルのキャスト、's、 ' sのさまざまな組み合わせを試しましたがstatic_cast<intptr_t>(obj)
、stdint.hを含めています。私が読んだことから、私が試した多くのことの1つはうまくいくはずです。何が得られますか?reinterpret_cast<intptr_t>(obj)
intptr_t
unsigned int
私が説明したとおりのコードであるため、わざわざコードを含めることはしませんでしたが、あなたが尋ねたので、これらすべてに加えて他の組み合わせを試しました。
それらはすべてまったく同じエラーを出します。
c# - ポインターを返す C++ メソッドを呼び出す C#。メモリ管理について説明する
以下の「メイン」の2つのC#行で、低レベル/メモリ管理の観点から正確に何が起こっているのか説明できますか?
C++ コード (アンマネージ):
C# コード:
具体的には、「myClass」に割り当てるスペースを .NET がどのように認識しているのか疑問に思っています。バックグラウンドで何らかの「Marshal.AllocHGlobal(SIZE)」を実行しているはずですよね?より多くのスペースが必要な場合 (名前を設定しますか?) はどうなりますか? また、ガベージコレクションが発生してメモリが移動し、「IntPtr myClass」が台無しになるリスクはありますか?
c# - 新しいIntPtr.Addメソッド-intのポイントが欠落していますか?
FW 4.0以降、IntPtr
構造には次のAdd
メソッドがあります。
IntPtr
これは、私たちが持っていた数学に関するすべての質問(1、2、おそらくそれ以上)に対処することになっているので、素晴らしいことです。
しかし、なぜoffset
int
ですか?
そうではないIntPtr
でしょうか?範囲を超える値で64ビットポインタをオフセットすることは容易に想像できint
ます。
たとえば、次のことを考慮してMarshal.OffsetOf
ください。
IntPtr
構造体メンバーへのオフセットとしてを返します。これは完全に理にかなっています!Add
また、このオフセットを新しい方法で簡単に使用することはできません。にキャストしてから、ループで数回Int64
呼び出す必要があります。Add
IntPtr.Size
また、適切に作成されたアプリケーションとは無関係であるという考えそのものを殺しているようです。オフセットをなどの特定のタイプにキャストするInt64
必要があります。その時点で、サイズの違いの管理を開始する必要があります。そして、128ビットIntPtr
が表示されたときに何が起こるかを想像してください。
ここでの私の質問は、なぜですか?
私は結論を正しているのでしょうか、それとも要点を見逃しているのでしょうか。
c# - どちらを使用するのが良い/安全か:HandleRefまたはIntPtr(Microsoftの新しいソースコードはHandleRefを使用しなくなりました)
たとえば、古い.NET Framework 2.0ソースコード(Windowsフォーム、Visual Studio 2005-Whidbey)では、 GetClientRect関数はHandleRefを使用して定義されていました。
新しいWindowsAPIコードパック(Microsoft、2009/2010から)では、同じ関数がIntPtrを使用して定義されています。
実際、 HandleRefはWindows APIコードパックのソースファイルでは使用されていませんが、古い.NETFrameworkソースファイルのネイティブメソッドの署名では頻繁に使用されていました。
c# - IntPtrからバイト配列へおよび戻る
IntPtrが参照しているデータをバイト[]に読み込んでから、別のIntPtrに戻そうとしています。ポインターはスキャナーデバイスからキャプチャされた画像を参照しているため、この情報のキャプチャはバイト配列に配置する必要があると仮定しました。
また、Marshal.SizeOf()メソッドが、IntPtrが参照しているデータのサイズを返すのか、ポインター自体のサイズを返すのかはわかりません。
私の問題は、「タイプ'System.Byte[]'をアンマネージ構造としてマーシャリングできません。意味のあるサイズまたはオフセットを計算できません」というエラーが表示されることです。
interop - ref、nullポインター、およびIntPtrによる構造体の受け渡しに関する相互運用の質問
同僚、
前文。私の質問は、ベストプラクティスについてです。私は1つの回避策を知っています。C#で相互運用機能を処理する必要があるのはこれが初めてですが、同時にCとC++でかなりの量のコードを記述しました。
アンマネージDLLによって公開されている関数を2回呼び出す必要があります。この関数は、構造体へのポインターを引数として取ります。null
初めてポインタを渡す必要があります。2回目は、構造体のインスタンスへのポインターを渡す必要があります。
この関数には6つのパラメーターがあるため、この質問の目的で機能する簡略化された宣言を以下に示します。(誰かが興味を持っているなら、私は詳細を投稿することができます。)これが宣言の最初の変形です:
に強く型付けされているので、私はそれが好きNEEDED_STRUCT_TYPE
です。しかし、nullポインターを渡すことができるようにするには、宣言を次のように変更する必要がありました。
IntPtr.Zero
これでポインタを渡すことができnull
ますが、パラメータは強く型付けされなくなりました。与えられた状況で、強く型付けされたパラメーターとnullポインターを渡す機能の両方を持つ方法はありますか?
どんな提案、洞察または参照も本当にありがたいです!
乾杯、
-ニック