C++Builder 64位编译后可执行文件体积超17MB的原因及优化方法咨询
C++Builder 64位编译后可执行文件体积超17MB的原因及优化方法咨询
我从C++Builder v3就开始用它开发了,大部分工作都是在v5和v6版本完成的。时隔几年我现在重新捡起来,尝试用Community Edition版本开发64位程序。我先把一个小工具移植到新环境里练手——这个工具只用了标准Windows控件(TEdit、TButton、TCheckBox等)和一个TClientSocket,单窗体代码不到400行。
但编译成功后,生成的可执行文件居然超过17MB!这也太大了吧,我完全没想到。我是按照以前用旧版本的方式配置的,本来想生成一个独立的自包含可执行文件(不依赖RTL等),在v6里编译出来只有540KB,现在同一代码在新版本里居然这么大,请问这是为什么?我该怎么优化体积?
formMain.h
#ifndef formMainH #define formMainH //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> #include <Registry.hpp> #include <Vcl.Buttons.hpp> #include <System.Win.ScktComp.hpp> //--------------------------------------------------------------------------- class TfMain : public TForm { __published: // IDE-managed Components TEdit *eScan; TComboBox *cbPrinter; TSpeedButton *bClear; TLabel *lDecoded; TCheckBox *ckAutoPrint; TBitBtn *bPrint; TBitBtn *bClose; TLabel *lScan; TLabel *lDecode; TLabel *lPrinter; TLabel *lPrinterIPAddress; TClientSocket *Sock; void __fastcall bCloseClick(TObject *Sender); void __fastcall FormShow(TObject *Sender); void __fastcall cbPrinterSelect(TObject *Sender); void __fastcall eScanChange(TObject *Sender); void __fastcall bPrintClick(TObject *Sender); void __fastcall SockConnect(TObject *Sender, TCustomWinSocket *Socket); void __fastcall SockDisconnect(TObject *Sender, TCustomWinSocket *Socket); void __fastcall eScanKeyPress(TObject *Sender, System::WideChar &Key); void __fastcall bClearClick(TObject *Sender); void __fastcall SockError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // User declarations TStringList *printerNames; TStringList *printerIPAddresses; AnsiString selectedIPAddress; AnsiString defaultPrinter; int __fastcall isCPSBarcode(AnsiString Str); int __fastcall isIPAddress(AnsiString Str); public: // User declarations __fastcall TfMain(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TfMain *fMain; //--------------------------------------------------------------------------- #endif
formMain.cpp
#include <vcl.h> #pragma hdrstop #include "formMain.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TfMain *fMain; //--------------------------------------------------------------------------- __fastcall TfMain::TfMain(TComponent* Owner) : TForm(Owner) { printerNames = new TStringList; printerIPAddresses = new TStringList; } //--------------------------------------------------------------------------- void __fastcall TfMain::FormShow(TObject *Sender) { AnsiString thisPort(""); AnsiString defaultPrinter(""); int defaultPrinterIdx = -1; TRegistry *Reg = new TRegistry; // Get network printer names and IP addresses from Windows registry // Locally connected printers are skipped since we will be using a TCP // socket to communicate with the printer Reg->RootKey = HKEY_LOCAL_MACHINE; if(Reg->OpenKeyReadOnly("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers")){ Reg->GetKeyNames(printerNames); Reg->CloseKey(); for(int i = 0; i < printerNames->Count; i++){ if(Reg->OpenKeyReadOnly( "\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\" + printerNames->Strings[i])){ thisPort = Reg->ReadString("Port"); if(isIPAddress(thisPort)){ cbPrinter->Items->Add(printerNames->Strings[i]); printerIPAddresses->Add(thisPort); } Reg->CloseKey(); } } } else{ if(Application->MessageBox(L"Unable to open registry!",L"Error",MB_OK)) Close(); } delete Reg; // Get default printer from last run Reg = new TRegistry; if(Reg->OpenKey("\\SOFTWARE\\TCC\\BinLabelShrink", true)){ if(Reg->ValueExists("DefaultPrinter")) defaultPrinter = Reg->ReadString("DefaultPrinter"); if(Reg->ValueExists("AutoPrint")) ckAutoPrint->Checked = Reg->ReadBool("AutoPrint"); if(defaultPrinter.Length()) for(int i = 0; i < cbPrinter->Items->Count; i++) if(cbPrinter->Items->Strings[i] == defaultPrinter) defaultPrinterIdx = i; if(defaultPrinterIdx > -1){ cbPrinter->ItemIndex = defaultPrin
内容来源于stack exchange
相关产品推荐
相关产品推荐

