コールバックについて


ダイ  2006-02-10 03:05:14  No: 19960

コールバックについて質問です。

delphi2005.NET版でメタファイルを処理しようとEnumMetaFileを使おう
としているのですが、「NUllReferenceException」となってしまいます。
また試しにEnumenhMetaFileでもやってみたのですが、同じエラーが
起きてしまいました。
コールバック関数の実装部にまで到達していないことまでは分かって
いるのですが、なぜいかないのか、初心者なのでよく分かりません。

試しに本にあったサンプルコードで、EnumFontFamiliesExWを使って、
他のコードを書いてみたのですが、そちらでは上手くいきました。
メタ関係のデリゲートは、何か変わった書き方等が必要なのでしょうか?
MSDN等を見ても、同じような書かれ方をしているように感じるのですが…

初歩的な質問と思いますが、どなたかご教授をお願い致します。


ダイ  2006-02-10 07:35:13  No: 19961

自分でもう少し調べてみました。

Win32でEnumMetaFileを実行してみたところ動くものを、
そのまま.NETに移行して(必要な部分は加えたつもりです)
実行したところ、やはりエラーとなってしまいました。
コードは以下のようにしてみました。

*****************************************************************
function WMFEnumProc(ADC: HDC; var AHandleTablePtr: THandleTable;var 
                     ARecord: TMetaRecord;AObjects: Integer; 
                     ALParam: LPARAM): Integer;
begin
  try
    Result := ALParam;
  except
    // 例外が発生した
    Result := 0 ;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CallBack: TFNMFEnumProc;
  error: DWORD;
  metaHandle: THandle;
begin
      CallBack := @WMFEnumProc;

      metaHandle := GetMetafile('メタファイルを指定');
      EnumMetafile(GetDC(0), metaHandle, CallBack, 1) ;
end;
*****************************************************************

静的DLLの利用を行って、動作させようとしているのですが、どうしても
上手くいきません。
どこがおかしいのかも分からないので、どなたかご教授頂きたいです。
お願いしますm(__)m


にしの  2006-02-10 10:12:29  No: 19962

Delphi2005を持っていないので的はずれかもしれませんが・・・

EnumMetaFileは、16ビット版Windowsとの互換性のために提供されます、とあるので、.NETでは無理なのかもしれません。
EnumEnhMetaFileでもダメですか?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpgdi/html/_win32_EnumMetaFile.asp
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpgdi/html/_win32_enumenhmetafile.asp


ダイ  2006-02-10 18:06:36  No: 19963

にしの様
ご解答ありがとうございます!的外れなんてとんでもないです。

EnumEnhMetaFileの方は、.NETFrameWork用に書き換えらえられ
そうなのは、msdnを見て分かってきました。
ちょっと試してみたいと思います!

しかし、できることならばEnumMetaFileを使いたいのです。
他のコード上で、WMFを処理する部分をそのまま使いたいが
ためなのですが、やはり無理なのでしょうか?


ダイ  2006-02-10 18:56:12  No: 19964

何度も連続書き込みをしてすいません。

EnumEnhMetaFileも上記のようなコードで試してみましたが、
同じ結果になってしまいました。
変更したところは

>ARecord: TMetaRecord;
ARecord: TEnhMetaRecord;
>  CallBack: TFNMFEnumProc;
CallBack: TFNEnhMFEnumProc;
あとRect構造体を適当に設定して、という変更をしました。

どちらも、play(enh)metafileでスクリーンに描画することは
できていたので、emf(wmf)ファイルがおかしいとかは無いと思うのですが…
純粋にコードの間違いであればいいのですが、あまりに自分の力が
足りないために、皆目見当がつけれない状態です…(泣)


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

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






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