TMemoryStreamを引数に使ったプログラムの作り方について


迷える子羊  2004-11-10 18:49:38  No: 11689

こんにちは、
最初に Delphi だけでなく C++Builder の両方についての
質問になり恐縮ですが、

目的:呼び出し側を Delphi で作成し、DLL側を C++Builder で作成します。

理由:C++Builder の処理コンポーネントを使用したいのですが、
      Delphi に簡単に移植できないので、C++Builder で
      DLL を作成して、このコンポーネントで処理した結果のデータを
      利用すれば・・・と思ったのですけど、うまくいきません。
      何か考え違いしているのかもしれませんので教えてください

以下が現状のプログラムのコードです。
よろしくお願いします.

≡≡≡≡≡
Delphi 側
≡≡≡≡≡
function FLoad(Fname: PChar; MStream: TMemoryStream): Boolean; stdcall; external 'DLLTest.dll' name 'FileLoad';
    :
implementation
    :
procedure TForm1.Button1Click(Sender: TObject);
var
  FileName:  String;
begin
  MStream := TMemoryStream.Create;
  try
    if OpenDialog.Execute then begin
      FileName := OpenDialog.FileName;
      MStream.Position := 0;
      FLoad( PChar(FileName), MStream);
      RichEdit.Text := 'Size = ' + IntToStr(MStream.Size);
    end;
  finally
    MStream.Free;
  end;
end;

≡≡≡≡≡≡≡
C++Builder側
≡≡≡≡≡≡≡
extern "C" __declspec(dllexport) bool __stdcall FileLoad(PChar FName, TMemoryStream *MStream);

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
  return 1;
}
//---------------------------------------------------------------------------
bool __stdcall FileLoad(PChar FName, TMemoryStream *MStream)
{
  try {
    MStream->LoadFromFile( FileName );
    return( true );
  } catch (...) {
    return( false );
  }
}


りりか  2004-11-10 19:00:20  No: 11690

DLL とそれを呼ぶ EXE との間でクラスのインスタンスを受け渡しすることは
できません。

TMemoryStream のインスタンスを受け渡ししたいなら、インスタンスそのものでは
なく、それが保持している MStream.Memory のポインタとサイズを受け取れば
いいと思います。


とおりすがり  2004-11-10 20:53:21  No: 11691

MLで答えが出れば良いですね。


とおりすがり2  2004-11-10 21:03:59  No: 11692

>調査の結果
>『DLL と EXE 間ではクラスのインスタンスの受け渡しができない。』
>ようです。

なんか悪質だな
ひとことコトワリ入れておけばいいのに


とおりすがり3  2004-11-10 21:07:15  No: 11693

にしても、ここよりMLのほうがマシだってことかよ。

どうでもいいが、回答者の時計が昨日から狂いっぱなし。読みづらい


とおりすがりん  2004-11-10 21:19:24  No: 11694


あ、同じこと書こうと思ったら先こされてた。

>調査の結果
>『DLL と EXE 間ではクラスのインスタンスの受け渡しができない。』

マルチを「調査」と称するその厚顔さにはあきれるばかりです。


とおりすがり  2004-11-10 22:30:06  No: 11695

時計直せよ。
どうでもいいが、ローカル変数を関数の返り値にするなよ。


りりか  2004-11-10 22:44:53  No: 11696

ML に行ってしまったんですよね? そうですか・・・・

> ポインタとサイズを受け取ればいいと思います。

じゃ、この例はいりませんね。


とおりすがり  2004-11-10 23:10:28  No: 11697

先生に言われるまで納得しないなら、最初からMLにしとけばいいのにね。
ここの回答者は信用ないのね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加