NEU 64-BIT DEV (Old 32-Bit Dev): Warum ist meine 64-Bit-ausführbare Datei so riesig?
Posted: 12 Jul 2025, 20:00
Ich habe mich seit V3 im C ++ - Builder entwickelt. Der größte Teil meiner Arbeit wurde in V5 und V6 erledigt. Ich bin gerade jetzt nach ein paar Jahren wieder darauf zurück und probiere die Community Edition und die 64-Bit-Welt aus. Ich habe ein kleines Dienstprogramm als erstes Projekt in der neuen Umgebung portiert. Es wird nur Standard -Windows -Steuerelemente (Bearbeiten, Schaltfläche, Kontrollkästchen usw.) und eine einzelne Socket -Steuerung verwendet. Es sind weniger als 400 Codezeilen in einem einzigen Windows -Formular. Was kann ich tun, um es zu reduzieren? Das scheint mir absurd groß zu sein, was es ist. Die ausführbare Datei erstellt in V6 zu 540 kb. Ich hatte in der aktuellen Version nicht mehr als 17 MB für denselben Code erwartet. < /P>
Code: Select all
///////////////////////
// formMain.h
///////////////////////
#ifndef formMainH
#define formMainH
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
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;
int __fastcall isCPSBarcode(AnsiString Str);
int __fastcall isIPAddress(AnsiString Str);
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;
public: // User declarations
__fastcall TfMain(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TfMain *fMain;
//---------------------------------------------------------------------------
#endif
//////////////////////
// formMain.cpp
//////////////////////
#include
#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 = defaultPrinterIdx;
cbPrinterSelect(cbPrinter);
}
else if(Reg->ValueExists("DefaultPrinter")) // The defaultPrinter wasn't found, so clear it
Reg->WriteString("DefaultPrinter","");
Reg->CloseKey();
}
delete Reg;
}
//---------------------------------------------------------------------------
void __fastcall TfMain::bCloseClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TfMain::cbPrinterSelect(TObject *Sender)
{
selectedIPAddress = printerIPAddresses->Strings[((TCustomCombo*)Sender)->ItemIndex];
lPrinterIPAddress->Caption = selectedIPAddress;
if(isCPSBarcode(eScan->Text))
bPrint->Enabled = true;
eScan->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TfMain::eScanChange(TObject *Sender)
{
int strLen;
int semiColonIdx;
int dashIdx;
AnsiString fullStr;
// Sample scan string "A:19:18:1;0-12680bB"
Sleep(100);
if(eScan->Text[eScan->Text.Length()] == ' '){
eScan->Text = eScan->Text.TrimRight();
eScan->SelStart = eScan->Text.Length();
eScan->SelLength = 0;
}
if(isCPSBarcode(eScan->Text)){
eScan->Font->Style = TFontStyles() ItemIndex > -1){
bPrint->Enabled = true;
if(ckAutoPrint->Checked) // Fire off print if we're on auto
bPrintClick(this);
}
}
else{
if(eScan->Text.Length()){
eScan->Color = clWindow;
eScan->Font->Color = clWindowText;
eScan->Font->Style = TFontStyles();
if(eScan->Text.Pos("