問題タブ [pchar]
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.
delphi - PChar('') は #0 (nil ではない) へのポインターであることが保証されていますか?
Delphi では、空の文字列 (AnsiString または WideString) を nil ポインタまたは実際の空の文字列へのポインタで表すことができることを理解しています。
実験により、Delphi XE2 (特定のコンパイラ設定) でそれを示しましたPChar('') <> nil
。しかし、これは保証されていますか、それとも将来のバージョンで変更される可能性がありますか、またはコンパイラの設定に依存する可能性がありますか?
私は自信の危機に瀕しています。誰かが私に決定的な答えを与えることができれば、私は感謝します.
c# - Delphi PChar を C# に渡す
c# 環境で、delphi インポートされた ActiveX コントロールのデータを転送する際に問題が発生します。
Delphi 側に、PChar を受け取って返す関数があります。私はそれを変更したり、好きなことをしたりできます。
プログラムの C# 側には、delphi 関数を呼び出す関数があり、噛むための文字列パラメーターを与えます。
私はそれをテストしましたが、C# が返された PChar を受け取るまではすべてうまくいくようです。次に、アプリケーション全体が応答を停止して終了します。例外メッセージを表示するために try-catch ブロックを実装しようとしましたが、何も表示される前にアプリがクラッシュします。
変数が同じ型ではないためにクラッシュすると思います。または、ソフトウェア バージョンの不一致が原因です: Delphi 5 + Visual Studio 2012.これをグーグル検索しましたが、これまでのところ運がありません。
どんな助けでも感謝します:)
delphi - ((Pointer)(P)+1)^ はいつ機能しますか?
私はdelphiXE2に取り組んでおり、PIntegerに取り組んでいました。私のデルファイコードでこれを行った場合
このエラーが発生しました。
PS:testInt := (P+1)^;
23行目です
ただし、これを試すと
それはうまくいきます!コンソールは 'b' を出力できます!
これがどのように発生し、いつ ((Pointer)(P)+1)^ が機能するかについては明確ではありませんか?
c++ - メモリリークなしでグローバル PCHAR を作成および編集する方法
これは基本的な質問のように思えるかもしれませんが、どこにも解決策が見つかりません。
カーネル モードから情報を取得する必要があります。したがって、私は IOCTL を使用します。私のユーザーモードアプリケーションは、大量のデータを転送する必要があるため、METHOD_OUT_DIRECT で DeviceIoControl を使用してこの IOCTL を送信します。これにより、char-Pointer がドライバーに送信されます。
ドライバーは IOCTL を取得し、割り込み要求内で応答できます。
コードは次のようになります。
しかし、カーネル モードの別の部分から情報をコピーする必要があります。
次のようなグローバル PCHAR を作成しようとしました。
ヘッダー ファイル (宣言) :extern PCHAR g_pDataPack;
ソースファイル (定義) :PCHAR g_pDataPack = "IOCTL DEFINITION";
編集 (その他のソースファイル):*g_pDataPack++ = 'some stuff';
私の問題は、割り込みがグローバル PCHAR をローカル PCHAR にコピーして USER-Mode-Application に送り返す前に、グローバル PCHAR を何度も編集して拡大する必要があることです。5000 エディションごとにグローバル ポインターをリセットしようとしましたが、実際にはうまくいきませんでした。
一定時間後にプログラムがクラッシュします。グローバルポインターが多くのスペースを割り当てるためだと思いますか?
CHAR 配列を作成しようとしましたが、まったく機能しませんでした。
特別なサイズのメモリを割り当ててからこれを編集し、必要に応じてローカルの PCHAR pReturnData にコピーする、より良い方法または簡単な方法はありますか、またはこのプロジェクトの DMA の操作方法を学ぶ必要がありますか?
delphi - Delphi dll 関数から pchar 型を返すにはどうすればよいですか?
次のエラーで実行する Vb6 コード。
エラーを修正するにはどうすればよいですか?
通常の文字列を返すにはどうすればよいですか?
vb6 コード
Delphi7 コード
delphi - PAnsiChar を (unicode-) 文字列に割り当てる正しい方法は何ですか?
ANSI テキスト (PAnsiChar) へのポインターを返す DLL 関数があります。これを(unicode-)文字列に割り当てたい(これはDelphi XE2です)。以下はコンパイルされますが、「W1057 Implicit String cast from 'AnsiChar' to 'string'」という警告が表示されます。
編集: 問題のテキストは英語のエラー メッセージであるため、ここで変換の問題が発生する可能性はほとんどありません。
私は今、このように明示的に Err を文字列に型キャストしたいと思っています...
..警告を取り除くために。これはうまくいかないでしょうか?代わりに、一時的な AnsiString 変数を使用する必要がありますか?
はいの場合、なぜですか?
それとも、コードが最初に PAnsiChar を AnsiString に変換し、次に AnsiString を String に変換することを明示する必要がありますか?
もちろん、関数にすることもできます。
これらのオプションはすべてコンパイルされますが、機能しますか? そして、ここでのベストプラクティスは何ですか?
ボーナス ポイント: コードは、理想的には、Delphi 2007 以降のバージョンでもコンパイルおよび動作するはずです。
string - PChar の一部を文字列に抽出するにはどうすればよいですか?
プロファイリング中に、かなりの時間がかかる関数に出くわしましたが、基本的には次の非常に単純なコードに要約されます。
この関数は予想される部分文字列を返しますが、長い入力に対してはうまくスケーリングしません。CPU ビューでアセンブラ コードを調べたところ、(私は通常、アセンブラ レベルで作業しているわけではありません) わかることから、 をAInput
呼び出す前に暗黙的に文字列に変換されているようCopy
です。
PChar
ただし、この時点では文字列/文字配列の長さは不明であるため、変換コードはnull ターミネータが見つかるまでその長さを移動する必要があります。これにより、より長い入力に対するひどいスケーリングが説明されます。
ただし、呼び出し元は の長さを渡すため、最初はメソッドを変換して代わりPChar
に使用できると考えていました。SetString
SetString
ゼロベース (コピーのように 1 ベースではない) の動作に加えてCopy
、入力の検証に関して他にも多くの小さなことが行われているようですが、そのすべてが文書化されているわけではありません (たとえば、1 未満の開始値が変更された場合) 1)に。したがって、上記の単純な実装は、常に元の実装として機能するとは限りません。
この関数はライブラリの一部であり、同僚によって広く使用されているため、私の目標はCopy
ルーチンを可能な限り複製することです。
次の実装がそれを達成するかどうか、または他の警告に注意する必要があるかどうか疑問に思っていますCopy
。注意:は、この関数が含まれるモジュール内の別の部分に由来するFLength
実際の長さです。AInput
この例では、他の部分を削除しました。
私は Delphi 2006 を使用していますが、これは製品の他のバージョン (少なくとも非 Unicode のもの) とあまり変わらないと思います。
delphi - Delphi は実行時に pchar を変更します
実行時に pchar 文字列を変更する必要があります。このコードで私を助けてください:
今、私は Delphi 7 に例外があります! 私のプロジェクトはネイティブのパスカル文字列を使用していません (windows.pas クラスなどはありません)
delphi - Delphi DLL から PChar を渡す
DLL から pchar を渡すにはどうすればよいですか? dll は、delphi だけでなく、他のアプリと互換性がある必要があります。ヘルプにローカル変数へのポインタ渡しは危険と書いてありますが、この変数をグローバルにするとコードがスレッドセーフではなくなります。
ワイド文字列を安全に渡すことができますが、この場合、dll は他の (Delphi 以外の) アプリと互換性がありません。
delphi - pcharによって引き起こされたデルファイ呼び出しデルファイdllメモリリーク
それでは、dllについて見てみましょう。
文字列を dll 呼び出しに渡したい場合は、プロシージャ入力 PChar を作成する必要があります。それ以外の場合は、データ curroption を取得します。
だから私たちは、私たちのdllが持っていると言います
これはいいです。次に、dll dpr で宣言する内容を見てみましょう。
Dll には FireDacConnection を含む Form がありますが、その中の任意のコンポーネントまたはオブジェクトが機能します。
問題は、この PChar が 2 回解放され、メモリ リークが発生することです。メモリ リークを発生させずに PChar を渡す方法が見つかりません。
あなたはfastmmを使うかもしれません、私はeurukalogを使います。
|+リーク #2: Type=UnicodeString: Ref count - 1, Content: "\r\n"; 合計サイズ=18; カウント=1 |
Unicode 文字列の Ref カウントが -1 になるのはなぜですか? それを防ぐ方法は?Unicode 文字列を正しく渡す方法は?
私が試したこと:constとして渡します。それをコピーします (例と strpcopy および strcopy のように) ローカル変数を使用して PChar のコピーを保持します。
編集:呼び出しコードを追加:
リーク ログ ダンプの追加
|+リーク #2: Type=UnicodeString: Ref count - 1, Content: "\r\n"; 合計サイズ=18; カウント=1 | |---------------------------------------------------------------- -------------------------------------------------- --------------------------------------| |00000002|04 |00000000|01D79D9C|outDll.dll|00009D9C|システム
| |_NewUnicodeString |23897[6] | |00000002|04 |00000000|008A11BC|myapp.exe |004A11BC|発信者
|TForm2 |Button4Click |66[2] | |00000002|04 |00000000|00641C13|myapp.exe |00241C13|Vcl.Controls |TControl |クリック |7348[9] | |00000002|04 |00000000|00646172|myapp.exe |00246172|Vcl.Controls |TWinControl |WndProc |10038[153] | |00000002|04 |00000000|0065B71C|myapp.exe |0025B71C|Vcl.StdCtrls |TButtonControl|WndProc |5163[13] | |00000002|04 |00000000|006462D7|myapp.exe |002462D7|Vcl.Controls | |DoControlMsg |10107[12] | |00000002|04 |00000000|00646172|myapp.exe |00246172|Vcl.Controls |TWinControl |WndProc |10038[153] | |00000002|04 |00000000|0070B240|myapp.exe |0030B240|Vcl.Forms
|TCustomForm |WndProc |4427[206] | |00000002|04 |00000000|006457AC|myapp.exe |002457AC|Vcl.Controls |TWinControl |MainWndProc |9750[3] | |00000002|04 |00000000|004F7614|myapp.exe |000F7614|System.Classes| |StdWndProc
|16600[8] | |00000002|03 |00000000|768162F7|user32.dll
|000162F7|USER32 | | | (gapfnScSendMessage+815 の可能性あり)| | | |00000002|03
|00000000|76816D35|user32.dll |00016D35|USER32 |
| | (可能な GetThreadDesktop+210) | | | |00000002|03
|00000000|76816DE8|user32.dll |00016DE8|USER32 |
| | (GetThreadDesktop+389 の可能性あり) | | | |00000002|03
|00000000|76816E49|user32.dll |00016E49|USER32 |
| | (GetThreadDesktop+486 の可能性あり) | | | |00000002|03
|00000000|77420107|ntdll.dll |00010107|ntdll |
|KiUserCallbackDispatcher | | | |00000002|03
|00000000|768196D0|user32.dll |000196D0|USER32 |
|SendMessageW | | | |00000002|03
|00000000|71AB459B|comctl32.dll |000A459B|comctl32 |
|LoadIconMetric | | | |00000002|03
|00000000|71AB45FE|comctl32.dll |000A45FE|comctl32 |
|LoadIconMetric | | | |00000002|03
|00000000|71AB4488|comctl32.dll |000A4488|comctl32 |
|LoadIconMetric | | | |00000002|03
|00000000|768162F7|user32.dll |000162F7|USER32 |
| | (gapfnScSendMessage+815 の可能性あり)| | | |00000002|03
|00000000|76816D35|user32.dll |00016D35|USER32 |
| | (可能な GetThreadDesktop+210) | | | |00000002|03
|00000000|76820D32|user32.dll |00020D32|USER32 |
| | (可能な GetClientRect+192) | | | |00000002|03
|00000000|76820D56|user32.dll |00020D56|USER32 |
|CallWindowProcW | | | |00000002|04
|00000000|00646282|myapp.exe |00246282|Vcl.Controls |TWinControl
|DefaultHandler |10079[30] | |00000002|04
|00000000|00646172|myapp.exe |00246172|Vcl.Controls |TWinControl
|WndProc |10038[153] | |00000002|04
|00000000|0065B71C|myapp.exe |0025B71C|Vcl.StdCtrls |TButtonControl|WndProc |5163[13] | |00000002|04 |00000000|004F7614|myapp.exe |000F7614|System.Classes| |StdWndProc
|16600[8] | |00000002|03 |00000000|768162F7|user32.dll
|000162F7|USER32 | | | (gapfnScSendMessage+815 の可能性あり)| | | |00000002|03
|00000000|76816D35|user32.dll |00016D35|USER32 |
| | (可能な GetThreadDesktop+210) | | | |00000002|03
|00000000|768177CE|user32.dll |000177CE|USER32 |
| | (可能な CharPrevW+314) | | | |00000002|03
|00000000|76817893|user32.dll |00017893|USER32 ||DispatchMessageW | | |
申し訳ありませんが、スタックオーバーフローエディターでタブを保持する方法がわかりません。