XE3への移植時の問題

解決


mizuki  2012-10-25 02:37:25  No: 43243

お世話になります。  今まで使っていたXP+D6p  から  Win7 + XE3(starter)に数日前より移植を始めました。Delphiではヴァージョン間の互換性の問題から移植はかなり面倒ではないかと思っていましたがいくつか試したところ(見た目の不具合は多々あるものの)とりあえずはそのまま動くものもありました。見た目の問題は追々解決するとして次の問題に引っかかりました。勉強不足で申し訳ありませんが教えてください。

1.実行ファイルサイズの問題:  とりあえずエラーがなく通った2つのexeファイルのサイズをD6で作ったものと比較すると  Aアプリ=679KB→2454KB    Bアプリ=1084KB→2650KB  と巨大化してしまいました。対策がありましたら教えてください。

2.Unicodeの問題(?)  (ここで”PAnsiCharとPWideCharには互換性がありません”のエラーが出る)
①他のアプリを起動させる:
kfile:=MyPath + '\PictureResize.exe';
WinExec(pchar(kfile), SW_SHOW);
  
②関連付けしたソフトを起動:
kfile:=mypath + '\help\index.html';
shellexecute(0,'open',pchar(kfile),nil,'',sw_shownormal);

何か解決法があるのではないかといろいろと探しましたが見つかっていません。  よろしくお願いします。


mona  2012-10-25 02:54:10  No: 43244

1はパス
2は関数にカーソルを持ってゆけば分かると思います。
WinExec(PAnsiChar,Cardinal)ですので
WinExec(pansichar(kfile), SW_SHOW);

ShellExecuteの場合は本来ならそのままコンパイルが通るはずなので分かりません。


mizuki  2012-10-25 03:29:47  No: 43245

mona様  ありがとうございます。
WinExecのところはPAnsiCharで通りました。
ShellExecuteは確かにそのままでOKでした。(関連付けが知らない間に切れていました)
一難去ってまた一難で苦戦しています。  ありがとうございました。


au  2012-10-25 17:49:50  No: 43246

ファイルサイズの問題は目をつぶるのが一番な気がしますが、どうしても気になる場合は、下記のコンパイラ指令をソースに記述することでRTTIを無効にしたら結構小さくなると見た記憶があります。
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}


mizuki  2012-10-26 20:45:36  No: 43247

au様  アドバイスいただいたアイデアを試しましたらサイズは若干縮小されました。  ありがとうございます。最初はUnit1に書いてみたのですが縮小効果がありませんでしたので調べてみたらどうやら*.dprに書くようでした。http://ht-deko.minim.ne.jp/tech040.html

これによる効果は  D6=679KB → XE3(オリジナル)=2650KB  XE3(RTTI無効?)=2034KB となりました。

写真のフォルダーに毎回添付して交換するものですのでサイズは極力小さくしたいと思いますがXE3ではこれが限界なのでしょうか?


monaa  2012-10-26 23:37:13  No: 43248

牡蠣ソースはHalbowさんが昔書かれたものですが、
XE2では22,528 バイト(22.0 KB)です。
コンパイラと言うよりVCLの肥大化が原因だと思われます。
VCLと決別するか、サイズを気にしないかのどちらかだと思います。
また不要な機能はどんどん削るのも手です。
と言いつつ私は全く気にしてませんが。

program Project1;

uses windows;

const
  WM_DESTROY          = $0002;

procedure MainDestroy(hWindow: HWND);
begin
  UnregisterHotKey(hWindow, 1);
  PostQuitMessage(0);
end;

//------------------------------------------------------------
//             Main Window Procedure
//------------------------------------------------------------
function MainWndProc(hWindow: HWND; Msg: UINT; WParam: WPARAM;
                     LParam: LPARAM): LRESULT; stdcall; export;
begin
  Result := 0;
  case Msg of
    WM_DESTROY: MainDestroy(hWindow);
  else
    begin
      result := DefWindowProc( hWindow, Msg, wParam, lParam );
      exit;
    end;
  end;
end;

//------------------------------------------------------------
//             Main Procedure
//------------------------------------------------------------
var
  wc: tagWNDCLASS;
  hWindow: HWND;
  Msg: TMsg;
begin
  wc.lpszClassName   := 'AppClass';
  wc.lpfnWndProc     := @MainWndProc;
  wc.style           := CS_VREDRAW or CS_HREDRAW;
  wc.hInstance       := hInstance;
  wc.hIcon           := LoadIcon(0,IDI_APPLICATION);
  wc.hCursor         := LoadCursor(0,IDC_ARROW);
  wc.hbrBackground   := (COLOR_WINDOW+1);
  wc.lpszMenuName    := nil;
  wc.cbClsExtra      := 0;
  wc.cbWndExtra      := 0;
  RegisterClass(wc);
  hWindow := CreateWindowEx(0,'AppClass','',WS_OVERLAPPEDWINDOW,0,0,200,200,0,0,hInstance,nil);
  RegisterHotKey(hWindow, 1, 0, VK_F1);
  ShowWindow(hWindow,CmdShow);
  UpDateWindow(hWindow);
//---- Message Loop ---------------------
  while GetMessage(Msg, 0, 0, 0) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  Halt(Msg.wParam);
end.


DEKO  2012-10-27 13:58:10  No: 43249

余談ですが、Delphi XE 以降のデフォルトアイコンは Vista アイコンに対応しており、256x256 アイコンが含まれています。

...ここまではいいのですが、アイコンには以下のリソースが含まれています。

256x256 Bitmap ARGB
  48x48 Bitmap ARGB
  32x32 Bitmap ARGB
  24x24 Bitmap ARGB
  16x16 Bitmap ARGB
  48x48 Bitmap 256 Color
  32x32 Bitmap 256 Color
  24x24 Bitmap 256 Color
  16x16 Bitmap 256 Color

アフォな事に 256x256 アイコンが PNG 形式ではありません。
このため、アイコンだけで 290KB もあります (XE2 以降)。

256x256 アイコンを PNG 形式にすれば、Vista / 7 /8 で特大アイコンが使える上に、サイズが 90KB 程度になります。
つまり、EXE のサイズも 200KB 程小さくなります。 

なお、2005〜2010 の デフォルトアイコンは 33KB、Delphi 7 より前のデフォルトアイコンは 4KB を超える事はありません。


UPX  2012-10-27 17:14:00  No: 43250

UPXで実行ファイルを圧縮するとういう手もあります。
http://upx.sourceforge.net/


Nov  2012-10-27 18:50:32  No: 43251

作り直すなら、サイズが10分の1になるという噂のKOL/MCKとか。
(XE2まで対応。気合いが必要?)

"KOL/MCKを使ってDelphiで小さな実行ファイルを作ろう" 
http://www.geocities.jp/sunnyvale3282/

本家に対応してほしいけど...


mizuki  2012-10-27 18:51:56  No: 43252

monaa様  DEKO様  UPX様  いろいろとありがとうございます。

XE3は単純に従来のDelphiの目先を少し変えたものかと思っていましたがいろいろと見聞きしていくうちに大変大きな機能の発展があったようであることが分かってきた気がします。exeのサイズが巨大化するのもやむなしと納得しました。

サイズを減らす手段をお教えいただきましたものは
1.VCLからの決別。(これは当方の腕では歯が立ちそうにありません)
2.アイコンサイズの減少
3.UPXによるexeファイルの圧縮
に要約されるものと思います。XE3の機能はかなり広がっているようですのでWindows8発売のニュースを見ているとXE3はこれから活躍できるものと思いますので本を買って勉強したいと思います。

現在やっているのはD6(パーソナル)で十分満足していますのでサイズが気になるものとそうでないものを用途によって使い分けるようにしていきたいと思います。しかしD6もこの先ビジネスにも使っていきたいと思いますのでパーソナルに代わる有償のものがあるかどうか探してみます。

XE3を使い始めたばかりで不勉強のまま質問させていただきましたがまたよろしくお願いします。ありがとうございました。


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

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






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