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

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

delphi - Delphi は実行時に pchar を変更します

実行時に pchar 文字列を変更する必要があります。このコードで私を助けてください:

今、私は Delphi 7 に例外があります! 私のプロジェクトはネイティブのパスカル文字列を使用していません (windows.pas クラスなどはありません)

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

delphi - Delphi DLL から PChar を渡す

DLL から pchar を渡すにはどうすればよいですか? dll は、delphi だけでなく、他のアプリと互換性がある必要があります。ヘルプにローカル変数へのポインタ渡しは危険と書いてありますが、この変数をグローバルにするとコードがスレッドセーフではなくなります。

ワイド文字列を安全に渡すことができますが、この場合、dll は他の (Delphi 以外の) アプリと互換性がありません。

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

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 | | |

申し訳ありませんが、スタックオーバーフローエディターでタブを保持する方法がわかりません。