喫茶XRAYトップページ


[11458] DLLの関数に文字列を渡す返信 削除
2017/10/15 (日) 21:08:53 Mr.XRAY
DLL の関数を作成して,その関数で,DLL 側で文字列を受け取る時は,
基本的には PChar 型にしておいた方が無難です.
以下は簡単な例です.
動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.

[参考]
[889] [08_DLL 内の関数で外部に文字列を渡す]
http://mrxray.on.coocan.jp/Delphi/plSamples/889_VCLStyleResource.htm#08


//----------------- DLLの全コード-----------------------------------------
// ファイル名は DllTest_PChar.dpr

library DllTest_PChar;

uses
  Windows,
  SysUtils,
  Dialogs;

function SetText2Dll(Buff: PChar):Bool; stdcall;
var
  LText : string;
begin
  LText := string(Buff);
  ShowMessage(LText);
  Result := True;
end;

exports
  SetText2Dll;

end.


//----------------- テスト側のコード ------------------------------------------

implementation

{$R *.dfm}

function SetText2Dll(Buff: PChar):Bool; stdcall; external 'DllTest_PChar.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := BoolToStr(SetText2Dll('日本語'));
end;


[11459] Re:DLLの関数に文字列を渡す返信 削除
2017/10/15 (日) 21:13:49 Mr.XRAY
> DLL の関数を作成して,その関数で,DLL 側で文字列を受け取る時は,
> 基本的には PChar 型にしておいた方が無難です.
> 以下は簡単な例です.


[DLLとの文字列の受け渡しがうまくいきません ]
https://forums.embarcadero.com/thread.jspa?threadID=258840&tstart=0

というのがありますが,これでは他の方が動作を検証できません.
言い尽くされたことですが,動作確認用のプロジェクトを作成して
そのコードを提示すれば誰かが確認できます.
そうでなければ抽象的なアドバイスしかできません.
具体的なアドバイスはできません.

と書くと,何万行のプログラムなのでそういうことはできません.
という方もいますが.(笑)


[11472] Re2:DLLの関数に文字列を渡す返信 削除
2017/10/16 (月) 17:39:56 Mr.XRAY
[DLLとの文字列の受け渡しがうまくいきません ]
https://forums.embarcadero.com/thread.jspa?threadID=258840&tstart=0#903352

上で提示したコードの場合,StrCopy を使用する必要がないのであれば,
以下のように PChar 型の変数に代入できます.
StrAlloc でメモリを確保した場合は StrDispose でメモリを解放します.

procedure TForm1.Button1Click(Sender: TObject);
var
  LPChar : PChar;
begin
  LPChar := PChar('ABCDE');
  Edit1.Text := BoolToStr(SetText2Dll(LPChar));
end;


[11473] Re3:DLLの関数に文字列を渡す返信 削除
2017/10/16 (月) 17:57:46 Mr.XRAY
> 上で提示したコードの場合,StrCopy を使用する必要がないのであれば,

どうしても StrCopy を使用する必要がある場合は,
例えば以下のように書けます.
質問された方のコードは省略があるので参考です.
この上もこのコードも動作確認は Windows 7 U64(SP1) + Delphi XE(UP1) Pro です.

procedure TForm1.Button2Click(Sender: TObject);
var
  LText  : string;
  LPChar : PChar;
begin
  //+1はnull終端文字の分
  //これがないと無効ポインタの操作となる
  LText := 'ABCDE';
  LPChar := StrAlloc(Length(LText) + 1);
  try
    StrCopy(LPChar, PChar(LText));
    Edit1.Text := BoolToStr(SetText2Dll(LPChar));
  finally
    StrDispose(LPChar);
  end;
end;

[11474] Re2:DLLの関数に文字列を渡す返信 削除
2017/10/16 (月) 19:03:32 Mr.XRAY
> と書くと,何万行のプログラムなのでそういうことはできません.
> という方もいますが.(笑)


掲示板のサーバの負担を軽減するため,という方もいましたね.
結局いろいろ訊くためにスレッドがかなり長くなったことを記憶しています.
サーバにかなり負担となってしまったのかも知れません (^^


[11480] DLL内の文字列を取得返信 削除
2017/10/19 (木) 09:08:13 Mr.XRAY
> [889] [08_DLL 内の関数で外部に文字列を渡す]
> http://mrxray.on.coocan.jp/Delphi/plSamples/889_VCLStyleResource.htm#08


DLL から文字列を取得する際,null 終端文字列 (PChar 型) のメモリ確保を DLL 内で
処理するサンプルを追加しました.

[09_DLL 内の文字列を取得 - DLL 内で PChar 型の領域確保]
http://mrxray.on.coocan.jp/Delphi/plSamples/889_VCLStyleResource.htm#09


[11484] Re:DLL内の文字列を取得返信 削除
2017/10/19 (木) 14:38:11 Mr.XRAY
> [09_DLL 内の文字列を取得 - DLL 内で PChar 型の領域確保]
> http://mrxray.on.coocan.jp/Delphi/plSamples/889_VCLStyleResource.htm#09


失礼しました.

GetDllText(PChar(LPChar));

なんて書いていました.動作しますが,訂正しました.
しかし,何でこう間違いが多いんでしょう ?
皆さん,火事と当サイトの記事にはご注意ください.


[11494] Re:DLLの関数に文字列を渡す返信 削除
2017/10/21 (土) 16:24:19 Mr.XRAY

[11499] 入出力兼用の引数返信 削除
2017/10/24 (火) 19:54:08 Mr.XRAY
[DLLとの文字列の受け渡しがうまくいきません ]
https://forums.embarcadero.com/thread.jspa?threadID=258840&tstart=0

↑ なんですが,読み返してみたら,DLL 内の関数の引数を
入出力兼用で使おうとしているみたいですね.
そういうことはないだろう,という固定観念で見ていますから,
なかなか気づきませんでした.省略もあるし.

ということで記事を追加しました.
それに伴い他のサンプルコードも少し修正,変更しました.

[05_文字列変数を DLL の入出力兼用の引数として使用する方法]
http://mrxray.on.coocan.jp/Delphi/plSamples/001_UseDLLProject.htm#05


[11500] Re:入出力兼用の引数返信 削除
2017/10/24 (火) 20:06:12 Mr.XRAY
> [05_文字列変数を DLL の入出力兼用の引数として使用する方法]
> http://mrxray.on.coocan.jp/Delphi/plSamples/001_UseDLLProject.htm#05


↑ こういうことはやらない方がいいです.
記事中にも書いていますが「どうしても」という場合です.ハイ.


INCM/CMT
Cyclamen v3.82