問題タブ [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.

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

winapi - GetWindowThreadProcessId (c#.net 4.0) を使用せずにウィンドウ ハンドルからプロセス ID を取得する

私たちのアプリケーションは最近、.net 3.5 から .net 4 に切り替えました。発生した問題の 1 つは、GetWindowThreadProcessId が機能しなくなったことです。

マイクロソフトはホットフィックスを利用できますが、それをすべての顧客のマシンにインストールするのは面倒であり、他の問題を引き起こす可能性があります。私は回避策を好むでしょう。

http://support.microsoft.com/kb/982638

問題は、マイクロソフトが説明したように、次のとおりです。

「.NET Framework リモート アプリケーションでは、MarshalByRefObject オブジェクトがあります。このオブジェクトには、IntPtr 型を返すメソッドが含まれています。オブジェクトはプロセス境界を越えて渡されます。オブジェクトがシリアル化されると、SerializationException 例外がスローされ、次のエラー メッセージ: Invalid type code in stream 'Invalid' この問題は、CLR が IntPtr をシリアル化するときに、リモート コードが IntPtr 型をプリミティブ型として扱うために発生します。バイナリ フォーマッタは IntPtr をシリアル化します。」

それで、代替案はありますか?ウィンドウ ハンドルからプロセス ID を取得する別の方法はありますか? または、このバグを回避するために IntPtr を別の方法でマーシャリングできますか?

0 投票する
0 に答える
2404 参照

vb.net - IntPtr から構造体の配列へ

VB.Net を介してネイティブ API を呼び出して、構造体の配列 (RootCausesInfo) へのポインターを渡します。これには、構造体の配列 (RepairInfoEx) へのポインターが含まれます。API のネイティブ署名はMSDN にあります - NdfDiagnoseIncident

VB.Net で使用した構造定義と PInvoke 呼び出しは次のとおりです。

上記の API を呼び出すコードは次のとおりです。

API 呼び出しが戻ると、rcInfoPtrToArray に RootCauseInfo 構造体へのポインター アドレスが設定されます。次の行で RootCauseInfo の各インスタンスを取得します。

これはうまくいきます。同様の IntPtr 演算を使用して、RepairInfoEx インスタンスの個々の要素に移動します。

次の行でrepairInfoExPtrをRepairInfoEx構造に変換すると、j = 0のRepairInfoExの最初のインスタンスで再び正常に機能します。

しかし、j=1 の次の反復では、ポインターが台無しになっているように見え、「'System.ExecutionEngineException' 型の例外がスローされました」というメッセージが表示されます。エラー。私は何を間違っていますか?

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

c - C99: 配列またはヒープ割り当てバッファーは UINTPTR_MAX で終了しますか?

次の不変条件を仮定できますか?

私が書いているパーサーでは、ポインターを使用して特定のオフセットをマークしたいと考えています。たとえばchar *end_of_submessageend_of_submessageは現在のバッファーに相対的です。ただし、サブメッセージが現在のバッファー内で終了しない場合は、現在のバッファー内のオフセットよりも大きい値を使用したいと考えています。だから私はするだろう:

ptr + len == UINTPTR_MAXしかし、malloc() が のようなメモリを返した場合、または配列が同じプロパティを持っていた場合、このスキームは阻止されます。これが決して起こらないと仮定しても安全ですか?規格上安全ですか?そうでない場合、実際には安全ですか?

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

c# - IntPtr から構造体の配列を取得する

私はこのような構造体を持っています

この構造体の配列へのポインタがあります。したがって、このポインターから配列を取得する必要があります。Marshal.PtrToStructure を使用しようとしましたが、メモリ読み取りエラーが発生しました。これは私の方法です:

それで、私は何を間違っていますか?

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

.net - .NET のウィンドウ ハンドルはその値を変更できますか?

.NET プロセスの存続期間中に、 のハンドルを実行しSystem.Windows.Forms.Formます。使用されるメイン フォームがApplication.Run(form)実際にその値を変更するとします。つまり、別のプロセスでハンドルの値を使用する場合、たとえばIntPtr handle = User32.FindWindow(null, "Name")、そのハンドルが.NET ランタイムによって無効にされますか?

編集

SendMessage等々WM_COPYDATAをIPCで使いたいのでハンドルを知りたいです。

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

c# - Monotouch を使用して IntPtr から ABPerson を取得する方法

Monotouch で IntPtr から ABPerson オブジェクトを取得する方法はありますか。私は ABPeoplePickerNavigationController とその ABPeoplePickerNavigationControllerDelegate を使用しています。メソッド ShouldContinue で、選択した人物のいくつかのプロパティを読み取る必要があります。私のコードは次のようになります。

そして、私のカスタム デリゲートは次のようになります。

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

c# - Marshal.PtrToStructure を介して IntPtr を Struct にマッピングすると、「アクセス違反例外」が発生します。

.NET で C++ DLL (EMI プロトコルを実装し、ソース コードを利用できるサード パーティ ライブラリ) を使用しようとしています。マーシャリング、関数の呼び出し、すべてが正常に機能するようになりました。

この問題は、IntPtr から .NET Struct にマーシャリングを戻したいときに発生します。コードは次のとおりです (提案どおりに変更 - 「ref」を削除し、AllocHGlobal を変更して emiStruct のサイズを割り当てるようにしました)。

最後の行 (PtrToStructure) により、「保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています」という例外が発生します。

また、デバッグ出力を確認できます。

問題は、ポインター emiIntPtr のメモリ割り当てのどこかにあると思います。ただし、コードを実行すると、サーバーへの接続に問題が発生します (サーバーが見つからないなど) が、続く構造体 emiStruct へのマーシャリングは正しく行われます (例外なし)。この問題は、接続が正常に確立され、サーバーが応答を送信した場合にのみ発生します。

また、.NET で使用しようとしているのと同じ DLL ライブラリを使用して C++ サンプル アプリを作成しました。このアプリケーションは (コンパイルすると) 正常に動作します。つまり、C++ DLL は問題なく、クラッシュを引き起こさないはずです。

さらに、プロジェクト コンパイラのいくつかのプロパティをチェック/チェック解除するためのいくつかのヒントを見つけました (JIT を使用する、x86 cpu 用にコンパイルするなど)。残念ながら、これは役に立ちませんでした。

問題がどこにあるのか、または .NET で IntPtr を正しく初期化して IntPtr と Struct をマッピングする方法について何か提案はありますか?

返信ありがとうございます:

ここでは、emi_init 関数の C++ ヘッダーを追加しています。

C# の emi_init 宣言は次のとおりです (提案されたように、emiPtr の "ref" 属性を削除しました)。

ただし、それでも同じ例外が発生します。

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

c# - IntPtr と Int を追加できません

C# Visual Studio 2010 に次の行があります。

そしてそれは言います:

演算子 '+' は、タイプ 'System.IntPtr' および 'int' のオペランドには適用できません。

MSDN によると、この操作は機能するはずです。

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

c# - C#でAPIを獲得します。IntPtrからこんにちはと低い言葉を取得します

C#でWM_MOUSEMOVEメッセージを処理しようとしています。

IntPtrの一種であるlParamからX座標とY座標を取得する適切な方法は何ですか?

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

c# - IntPtr を割り当てた DLL を特定する

私は、2 つの別個の C++ DLL から返された IntPtr を使用するシステムに取り組んでいます。アンマネージ メモリは、各 DLL で提供される OBJECT_FREE メソッドを呼び出すことによって解放されます。

残念ながら、一部のコードでは、最初にどの DLL がメモリを割り当てたかを追跡できません。これにより、Win7 に移行したため、アクセス違反が発生します (何らかの理由で Wi​​nXP では回避していました)。

中期的には、これを適切に処理するためにすべての IntPtr をまとめる必要がありますが、短期的には、最初にメモリを割り当てた DLL を特定する方法はありますか?