問題タブ [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.
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 を別の方法でマーシャリングできますか?
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' 型の例外がスローされました」というメッセージが表示されます。エラー。私は何を間違っていますか?
c - C99: 配列またはヒープ割り当てバッファーは UINTPTR_MAX で終了しますか?
次の不変条件を仮定できますか?
私が書いているパーサーでは、ポインターを使用して特定のオフセットをマークしたいと考えています。たとえばchar *end_of_submessage
、end_of_submessage
は現在のバッファーに相対的です。ただし、サブメッセージが現在のバッファー内で終了しない場合は、現在のバッファー内のオフセットよりも大きい値を使用したいと考えています。だから私はするだろう:
ptr + len == UINTPTR_MAX
しかし、malloc() が のようなメモリを返した場合、または配列が同じプロパティを持っていた場合、このスキームは阻止されます。これが決して起こらないと仮定しても安全ですか?規格上安全ですか?そうでない場合、実際には安全ですか?
c# - IntPtr から構造体の配列を取得する
私はこのような構造体を持っています
この構造体の配列へのポインタがあります。したがって、このポインターから配列を取得する必要があります。Marshal.PtrToStructure を使用しようとしましたが、メモリ読み取りエラーが発生しました。これは私の方法です:
それで、私は何を間違っていますか?
.net - .NET のウィンドウ ハンドルはその値を変更できますか?
.NET プロセスの存続期間中に、 のハンドルを実行しSystem.Windows.Forms.Form
ます。使用されるメイン フォームがApplication.Run(form)
実際にその値を変更するとします。つまり、別のプロセスでハンドルの値を使用する場合、たとえばIntPtr handle = User32.FindWindow(null, "Name")
、そのハンドルが.NET ランタイムによって無効にされますか?
編集
SendMessage
等々WM_COPYDATA
をIPCで使いたいのでハンドルを知りたいです。
c# - Monotouch を使用して IntPtr から ABPerson を取得する方法
Monotouch で IntPtr から ABPerson オブジェクトを取得する方法はありますか。私は ABPeoplePickerNavigationController とその ABPeoplePickerNavigationControllerDelegate を使用しています。メソッド ShouldContinue で、選択した人物のいくつかのプロパティを読み取る必要があります。私のコードは次のようになります。
そして、私のカスタム デリゲートは次のようになります。
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" 属性を削除しました)。
ただし、それでも同じ例外が発生します。
c# - IntPtr と Int を追加できません
C# Visual Studio 2010 に次の行があります。
そしてそれは言います:
演算子 '+' は、タイプ 'System.IntPtr' および 'int' のオペランドには適用できません。
c# - C#でAPIを獲得します。IntPtrからこんにちはと低い言葉を取得します
C#でWM_MOUSEMOVEメッセージを処理しようとしています。
IntPtrの一種であるlParamからX座標とY座標を取得する適切な方法は何ですか?
c# - IntPtr を割り当てた DLL を特定する
私は、2 つの別個の C++ DLL から返された IntPtr を使用するシステムに取り組んでいます。アンマネージ メモリは、各 DLL で提供される OBJECT_FREE メソッドを呼び出すことによって解放されます。
残念ながら、一部のコードでは、最初にどの DLL がメモリを割り当てたかを追跡できません。これにより、Win7 に移行したため、アクセス違反が発生します (何らかの理由で WinXP では回避していました)。
中期的には、これを適切に処理するためにすべての IntPtr をまとめる必要がありますが、短期的には、最初にメモリを割り当てた DLL を特定する方法はありますか?