You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 11:43:00