問題タブ [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 のもの) とあまり変わらないと思います。