公告

國明的網路筆記

2016年8月24日 星期三

Delphi7 自帶控制項安裝對應表


出處: http://www.cnblogs.com/FKdelphi/p/4654751.html

原來的控制項delphi7裡何處尋? 經常有朋友提這樣的問題,我原來在delphi5或者delphi6中用的很熟的控制項到哪裡去了?是不是在delphi7中沒有了呢?這是不是意味著我以前寫的代碼全都不能夠移植到delphi7中來了呢?是不是我必須學習適應這些新的控制項呢?

現在我就對這一問題進行解釋,並對在delphi7中的VCL以及CLX進行一下總結,方便有這方面需求的朋友進行查詢

其實,我們在原來版本如D5D6中使用的控制項如Quickrep,FastNet等,在D7中仍然是保留的。只是Delphi沒有將他們預設的安裝到元件面版中來。這些控制項包全部保存在Delphi目錄的bin下,檔副檔名為.bpl(共將近60個)。
安裝這些包的方法很簡單,只需點擊功能表"component---->Install Packages...",然後使用"ADD"選擇需要的包就可以了。


下面就其中的一部分bpl清單說明其中的控制項:

dclact70.bpl (Borland Actionbar Components)
包括的控制項:TStandardColorMapTTwilightColorMapTXPColorMapTActionToolBarTActionManagerTActionMainMenuBarTCustomizeDlg

dclado70.blp(Borland ADO DB Components)
包括的控制項:TADOCommandTADOConnectionTADODataSetTADOQueryTADOStoredProcTADOTableTRDSConnection

dclbde70.bpl(Borland BDE DB Components)
包括的控制項:TDBLookupComboTDBLookupListTBatchMoveTDatabaseTNestedTableTqueryTSessionTStoredProcTTableTUpdateSQL

dclclxdb70.bpl(Borland CLX Database Components)
包括的控制項:TDBCheckBoxTDBComboBoxTDBEditTDBImageTDbListBoxTDBLookupComboBoxTDBLookupListBoxTDBMemoTDBNavigatorTDBRadioGroupTDBTextTDBGrid

dclclxstd70.bpl(Borland CLX Standard Components)
包括的控制項:TActionListTBitBtnTSpeedButtonTCheckListBoxTAnimateTHeaderControlTIconViewTListViewTPageControlTProgressBarTSpinEditTStatusBarTTabControlTTextBrowserTTextViewerTToolBarTTrackBarTTreeViewTColorDialogTFindDialogTFontDialogTOpenDialogTSaveDialogTBevelTControlBarTImageTPaintBoxTPanelTRadioGroupTShapeTSplitterTTimerTDirectoryTreeViewTFileEditTFileHistoryComboBoxTFileIconViewTFileListViewTFilterComboBoxTDrawGridTImageListTMaskEditTMainMenuTPopupMenuTButtonTCheckBoxTComboBoxTEditTGroupBoxTLabelTLCDNumberTListBoxTMemoTRadioButtonTScrollBar

dcldb70.bpl(Borland Database COmponents)
包括的控制項:TDdataSourseTDBCtrlGridTDBCheckBoxTDBComboBoxTDBEditTDBImageTDBListBoxTDBLookupComboBoxTDBLookupListBoxTDBMemoTDBNavigatorTDBRadioGroupTDBRichEditTDBTextTDBGrid

dclmcn70.bpl(Borland DataSnap Connection Components)
包括的控制項:TConnectionBrokerTDCOMConnectionTSharedConnectionTSimpleObjectBrokerTSocketConnectionTWebConnectionTLocalConnection

dcldbx70.bpl(Borland dbExpress Components)包括的控制項:TSQLConnectionTSQLDataSetTSQLMonitorTSQLQueryTSQLStoredProcTSQLTable

dcldss70.bpl(Borland Decision Cube Components)
包括的控制項:TDecisionCubeTDecisioinSourceTDecisionGraphTDecisionGridTDecisionPivotTDecisionQuery

ibevnt70.bpl(Borland Interbase Event Alerter Component)
包括的控制項:TIBEventAlerter

dclnet70.bpl(Borland Internet Components)
包括的控制項:TQueryTableProducerTDataSetTableProducerTSQLQueryTableProducerTDataSetPageProducerTWebDispatcherTPageProducerTTcpClientTTcpServerTUdpSocketTXMLDocument

dclisp70.bpl(Borland Internet Solutions Pack Components)
包括的控制項:TFTPTHTMLTHTTPTNNTPTPOPTSMTPTTCPTUDP

dclwbm70.bpl(Borland InternetExpress Components)
包括的控制項:TInetXPageProducerTMidasPageProducerTXMLBrokerTXMLTransformTXMLTransformClientTXMLTransformProvider

dclmid70.bpl(Borland MyBase DataAccess Components)
包括的控制項:TClientDataSetTDataSetProvider

dclsmp70.bpl(Borland Sample Components)
包括的控制項:TCalendarTColorGridTDirectoryOutlineTGaugeTSpinButtonTSpinEdit

dclocx70.bpl(Borland Sample Imported ActiveX Controls)
包括的控制項:TChartfxTF1BookTVtChartTVSSpell

dcldbxcds70.bpl(Borland SimpleDataset Component(DBX))
包括的控制項:TSimpleDataSet

dclsoap70.bpl(Borland SOAP Components)
包括的控制項:TOPToSoapDomConvertTSoapConnectoinTHTTPRIOTHTTPSoapPascalInvokerTHTTPReqRespTHTTPSoapDispatcherTWSDLHTMLPublish

dclsockets70.bpl(Borland Socket Components)
包括的控制項:TClientSocketTServerSocket

dclstd70.bpl(Borland Standard Components)
包括的控制項:TActionListTApplicationEventsTBitBtnTSpeedButtonTCheckListBoxTCOMAdminCatalogTAnimateTComboBoxExTCoolbarTDateTimePickerTHeaderControlTHotKeyTListViewTMonthCalendarTPageControlTPageScrollerTProgressBarTRichEditTStatusBarTTabControlTToolBarTTrackBarTTreeViewTUpDownTImageListTDdeClientConvTDdeClientItemTDdeServerConvTDdeServeritemTColorDialogTFindDialogTFontDialogTOoenDialogTPageSetupDialogTPrintDialogTPrinterSetupDialogTReplaceDialogTSaveDialogTBevelTColorBoxTControlBarTImageTLabeledEditTPaintBoxTPanelTRadioGroupTShapeTSplitterTTimerTOpenPictureDialogTSavePictureDialogTScrollBoxTDrawGridTStringGridTMaskEditTMainMenuTmediaPlayerTOleContainerTButtonTCheckBoxTComboBoxTEditTGroupBoxTLabelTListBoxTMemoTRadioButtonTScrollBarTStaticTextTValueListEditorTXPManifest

dclwebsnap70.bpl(Borland WebSnap Components)
包括的控制項:TDataSetAdapterTDataSetValuesListTAdapterPageProducerTAdapterTApplicationAdapterTEndUserAdapterTEndUserSessionAdapterTLoginFormAdapterTPagedAdapterTStringsValuesListTAdapterDispatcherTLocateFileServiceTPageDispatcherTWebAppComponentsTSessionsServiceTWebUserListTXSLPageProducer

dcl31w70.bpl(Delphi1.0 Compatibility Components)
包括的控制項:THeaderTNotebookTDirectoryListBoxTDriveComboBoxTFileListBoxTFilterComboBoxTOutlineTTabbedNotebookTTabSet

DCLIB70.bpl(InterBase DataAccess Components)
包括的控制項:TIbClientDataSetTIBDataSetTIBDatabaseTIBTransactionTIBDatabaseinfoTIBeventsTIBExtractTIBQueryTIBSQLTIBSQLMonitorTIBStoredProcTIBTableTIBUpdateSQL

dclindy70.bpl(Internet Direct(Indy)for D7 Property and Component Editors)
包括的控制項:TIdAntiFreezeTIdBlockCipherInterceptTIdChargenServerTIdChargenUDPServerTIdDecodeMIMETIdEncodeMIME...

dclie70.bpl(Internet Explorer Components)
包括的控制項:TWebBrowser

dclIntraweb_50_70.bpl(Intraweb 5.0 Design Package for Delphi7)
包括的控制項:TIWClientSideDatasetTIWCheckBoxTIWButtonTIWEdit...

dcloffice2k70.bpl(Microsoft Office 2000 Sample Automation Server Wrapper Components)
包括的控制項:TAccessApplicatoinTAccessFormTAccessReferencesTAccessReportTClass_TBinderTExcelApplicationTExcelChartTExcelOLEOBjectEExcelQueryTableTExcelWorkbookTExcelWorksheetTmasterTPowerPointApplicationTPowerPointPresentationTPowerPointSlideTContactItemTDistListItemTDocumentItemTExplorersTFoldersTInspectorsTItemsTJournalItemTnameSpaceTOutlookApplicationTOutlookBarGroupsTOutlookBarPaneTOutlookBarShortcutsTPostItemTRemoteItemTReportItemTTaskRequestAcceptItemTTaskRequestAcceptItemTTaskRequestDeclineItemTTaskRequestItemTTaskRequestUpdateItemTWordApplicationTWordDocumentTWordFontTWordLetterContentTWordParagraphFormat

dclqrt70.bpl(QuickReport Components)
包括的控制項:TQRDBImageTQRDBRichTextTQRDBTextTQRExprTQRExprMemoTQRImageTQRLabelTQRLabelTQRMemoTQRRichTextTQRShapeTQRSysDataTQRCSVFilterTQRHTMLFilterTQRTextFilterTQRPreviewTQRBandTQRChildBandTQRCompositeReportTQRGroupTQRStringsBandTQRSubDetailTQuickRep

dclRave70.bpl(Rave Reports DE 5.0 Package)
包括的控制項:TRvCustomConnectionTRvQueryConnectionTRvTableConnectionTRvDataSetConnectionTRvNDRWriteTRvProjectTRvRenderHTMLTRvRenderPDFTRvRenderPreviewTRvRenderPrinterTRvRenderRTFTRvRenderTextTRvSystemTRvCustomConnectionTRvTableConnectionTRvDataSetConnectionTRvNDRWriterTRvProject

dclshlctrls70.bpl(Shell Control Property and Component Editors)
包括的控制項:TShellChangeNotifierTShellComboBoxTShellListViewTShellTreeview

dcltee70.bpl(TeeChart Components)
包括的控制項:TChartTDBChart

dcltqr70.bpl(TeeChart for QuickReport Components)
包括的控制項:TQRChart

---------------------------------------
Delphi7QuickReport的安裝:
點擊Componnet菜單的Install Packages,點擊Add...添加QuickReport Components
的路徑X:\Borland\Delphi7\Bin\dclqrt70.bpl(XDelphi的安裝路徑) 

dclsockets70.bpl FastNet

Delphi7中網路元件已由Indy代替,Rave代替QuickReport一樣, FastNet安裝:
點擊Componnet菜單的Install Packages,點擊Add...添加QuickReport Components
的路徑X:\Borland\Delphi7\Bin\dclsockets70.bpl(XDelphi的安裝路徑)


2016年8月8日 星期一

如何使用C++ Builder與VC開發的DLL

資料來源:http://aftcast.pixnet.net/blog/post/22191720-使用vc與bcb開發的dll
如何使用C++ Builder與VC開發的DLL

首先,請參照下面重要的export function name的規則。
__________________________________________________________________
呼 叫 慣 例    原 始 函 式           Borland C++Builder     Microsoft Visual C++
 __cdecl         MyFunc_cdcel    _MyFunc_cdcel              MyFunc_cdcel      
 __stdcall       MyFunc_std       MyFunc_std                    _MyFunc_std@8      
 __fastcall      MyFunc_fast      @MyFunc_fast              @MyFunc_fast@8    
-----------------------------------------------------------------------
說明:
假如你使用BCB來製作DLL,而你宣告 __declspec(dllexport) MyFunc_cdcel,那麼PE中的export table會記載 _MyFunc_cdcel (有底線)
假如你使用VC來製作DLL,而你宣告 __declspec(dllexport) MyFunc_cdcel,那麼PE中的export table會記載 MyFunc_cdcel (沒有底線)

1/ 我們先針對DLL使用__cdecl的情形來轉換:

由上表可知,BCB對於cdecl convention的function是會在function前面加上 _ 底線。
BCB對於stdcall 的部份則是沒加 _ 。
VC的部份則是相反。

所以在製作for BCB lib from VC DLL時需要用下面的方法(針對cdcel的部份):
implib -a -c -f mybcb.lib myvc.dll ::a 參數強迫加入 _ alias to MS cdecl


2/ 通用的轉換方式,可用於__cdecl與__stdcall等情形

A/ 先透過impdef程式來產生DEF檔(module defintion file)
B/ 根據最上面的表,並探索該dll的pe表頭來對照出export函式是哪一種convention
C/ 若def檔內有=號分左右邊,將原左邊變成右邊,再把左邊依Borland C++的export function name規則建立起來。
D/ 若def檔中沒有=號,那麼就直接修改左邊的名稱為Borland C++的export function name規則。
E/ 存檔後再用個自的lib工具來製作lib檔。
F/ 必要的話終極方式就是修改dll檔中的import table

以__stdcall為例,使用通用的法則:
先使用impdef test.def myvc.dll
假使test.def的內容如下
EXPORTS
    _Sub@8                        =_Sub              @1
則把它修改成如下
EXPORTS
   Sub = _Sub@8  @1  ;左邊的Sub已經沒有@8之類的裝飾

修改好後再執行Implib MyBcbStdcall.lib test.def ,就可以得到可用的lib檔了!

相反的,若要使BCB.DLL來給VC++用時,也是先產生def檔,然再查表修改def檔,再由VC自帶的lib /DEF:xxx.def來產生vcl lib檔。

註:
def中的右邊是所謂的internal name。是指原函式在compiler後的真實名字。用於link時期的比對,比如在DOS時代若要把C的obj檔與ASM的obj檔link起來時就要注意這名字的吻合。

補充重點: 以上的lib修改好後,都尚需要配合含有extern "C" 這關鍵字的header檔才可以算完成。請參考我另一篇關於extern "C"的文章

Calling convention VC++                   BCB
__cdecl                   _Function                    _Function
__stdcall                   _Function@n Function
上表是internal name 的規則

PS .  BCB 的 internal name 與 export name 是一樣的。但VC的 internal name 與 export name 不一定一樣!

2016年5月29日 星期日

透過BCB備份MSSQL資料庫

首先到MSSQL的資料庫(master)中建立一個「預存程序(stored procedure)」:
CREATE PROCEDURE backupdb
  @dbName varchar(10),
  @directory varchar(100)
AS
  backup database @dbName
  to disk=@directory


然後到BCB中建立一個新的專案(Project1),使用三個元件(Button1, ADOConnection1, ADOStoredProc1),請先設定ADOConnection1中的ConnectionString的屬性,使之與MSSQL連結。
其餘程式碼如下:
String __fastcall TForm1::GetSqlServerPath() // 抓取MSSQL路徑
{
  String result,tmp;

  TADOQuery *Query = new TADOQuery(this);
  Query->Connection = ADOConnection1;
  Query->Close();
  Query->SQL->Clear();
  Query->SQL->Add("select filename from sysdatabases where name='master'"); // 單引號中的master改為要備份的資料庫名稱
  Query->Open();
  tmp = Query->FieldByName("filename")->AsString;
  result = tmp.SubString(1, tmp.Length() - 15); // 取得資料庫路徑
  Query->Free();
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String daStr = FormatDateTime("yyyy-mm-dd hh-mm-ss",Now());
  try{
     String path = Form1->GetSqlServerPath() + "backup";
     ADOStoredProc1->Close();
     ADOStoredProc1->Connection=ADOConnection1;
     ADOStoredProc1->Prepared = true;
     ADOStoredProc1->ProcedureName = "backupdb;1";
     ADOStoredProc1->Parameters->ParamByName("@dbName")->Value = "master"; // 為要備份的資料庫名稱
     ADOStoredProc1->Parameters->ParamByName("@directory")->Value = path+" \\ master" + daStr; // 此處請注意因Blog關係,請將雙引號中的空格刪除,原程式中沒有空格,若不刪除空格可能造成備份檔案路徑不正確。
     ADOStoredProc1->ExecProc();
     Application->MessageBox("備份完成", "提示", MB_OK + MB_ICONINFORMATION);
     this->Close();
   }
   catch(...){
     Application->MessageBox("備份出錯,請重新再來", "警告", MB_OK + MB_ICONWARNING);
     return;
   }
}
//---------------------------------------------------------------------------

怎樣在C++ Builder中創建使用DLL


怎樣在  C++ Builder 中使用  DLL

使用 C++ Builder 呼叫 DLL 檔有兩個方法,將 DLL 檔透過 implib.exe 這個檔案將 DLL 檔輸出成 LIB 檔,然後將 LIB 檔加入到 C++ Builder 的專案(project)中。
將 LIB 檔加入到 C++ Builder 專案後,要再做一個 H檔。有些提供 DLL 檔的廠商會一併提供 H檔,如果沒有的話,就要自己慢慢敲囉!其他的使用方法就跟 include 其他 H 檔或是 Form 類似。
或許有人會覺得這樣轉來轉去不是很麻煩嗎?但這是我個人的習慣,習慣是一種很可怕的東西,很多東西習慣了,就不想改囉!
implib.exe 可以在 C++ Builder 的安裝路徑底下找到。
使用 implib.exe 轉檔的方法:
  implib xxx.lib xxx.dll

一、創建
   使用  File|NEW 建立一個新的  DLL 工程,並保存好檔C++ Builder 會生成一個  DLL 的程式框架。
  1DllEntryPoint 函數為一個入口方法,如果使用者在  DLL 被系統初始化或者登出時被調用,用來寫入對 DLL 的初始化程式和卸載程式;參數:hinst 用來指示  DLL 的基底位址;reason 用來指示 DLL 的調用方式,用於區別多執行緒單執行緒對  DLL 的調用、創建、卸載  DLL
  2.在程式中加入自己所要創建的  DLL 過程、函數; 
  3.用  dllimport 描述出口;
  例程式如下: 
   #include 
   #pragma hdrstop 

  extern "C" __declspec(dllexport) int test(); 

  int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason,void *) 
  {
   return 1; 
  

  int test() 
  
    return 3; 
  }

 注意:動態連結程式庫中調用過程、函數時有不同的CALL方式 __cdecl__pascal, __fastcall__stdcallBCB中預設的方式為__cdecl(可不寫),如果考慮相容性可用時__stdcall聲明方法為: 
  extern "C" __declspec(dllexport) int __stdcall test();
  對於其中過程、函數也改為: 
  int __stdcall test() 

二、使用DLL 
BCB中使用DLL有兩種方法:
  1.用靜態調用法 
  首先需要在  C++ Builder 的專案中加入輸入介面庫(import library),打開工程項目,使用BCB View|Project Manager打開專案列表,向專案中加入介面庫(*.lib) 
其次在標頭檔中加入介面聲明。 
例程式如下: 
例一:
  // define in include file 
   extern "C" __declspec(dllimport) int __cdecl test(); 
  // use function in main program 
  int I 
  I=test();

例二:
  // BCB中的宣告 *.dll
  extern "C" __declspec(dllexport) __stdcall int Myfunction_Add(int x,int y)
  {
     int z = x + y;
     return z;
  }

注意:
  (1)動態連結程式庫調用過程、函數時  CALL 方式 與創建時方式一樣不寫為__cdecl,其它需要聲明。 
  (2)C++ Builder 創建的DLL有對應的輸入介面庫(import library),如只有DLL而無庫時,可用BCBimplib工具產生:implib xxx.lib xxx.dll;另外可用:tlibxxx.lib,xxx.lst 產生DLL的內建函式列表,許多Windows的未公開技術就是用這種方法發現的。 

2.動態調用法 
 動態調用法要用Windows API 中的LoadLibrary()GetProcAddress()來調入DLL庫,指出庫中函數位置,這種方法較常見。
例程式如下: 
例一:
   HINSTANCE dd; 
   int _stdcall (*ddd)(void); 
   dd=LoadLibrary("xxx.dll");
   ddd=GetProcAddress(dd,"test"); 
   Caption=IntToStr(ddd()); 
   FreeLibrary(dd);

例二:
   int (*Myfunction_Add)(int,int);
   HINSTANCE hInst=LoadLibrary("my.dll");
   if (hInst == NULL)
   {
     ShowMessage("Null");
   }
  (FARPROC &) Myfunction_Add = GetProcAddress(hInst, "Myfunction_Add");
   int c = Myfunction_Add(10,20);
   ShowMessage(c);
   FreeLibrary(hInst);

例三:C# 引用
   //載入 + 宣告
   [DllImport("d:\\my.dll")]
   public static extern int Myfunction_Add(int x,int y);
   // 使用
   int c = Myfunction_Add(10,20);
   MessageBox.Show(c.ToString());

三、注意: 
  創建DLL時編譯連結時注意設置Project Options 
  Packages標籤:去除Builder with runtime packages檢查框。 
  Linker標籤:去除Use dynamic RTL檢查框。 
  否則創建的DLL需要Runtime packages or Runtime library

調用DLL函數時出現stack overflow問題的解決辦法

調用DLL函數時出現stack overflow問題的解決辦法

為了讓BCB使用其他C++編譯器產生的DLL檔案,首先使用靜態調度DLL的方式,方法為產生BCB需要的Lib檔案(使用implib MyDLL.lib MyDLL.dll 來產生)

計畫檔加入 *.lib 後,在檔案開頭用
extern "C" __declspec(dllimport) int  SearchSolution(char* info);

宣告...

結果:當我們執行迴圈:while(SearchSolution(info)){....}  時候,且執行的東西夠大,立刻就會產生Overflow!該怎麼解決呢?

這個問題,在網路終於在一個解答,有趣的是,對方是問另一個完全不相干的問題,我就在想,該不會這有影響吧!一試下去!果然解決!!

答案....使用動態調用DLL大法!!!!

改宣告

HANDLE hdDll;

int ( *Dll_SearchSolution)(char* info);

hdDll=LoadLibrary("MainAlgorithm.dll");//使用WinAPI

Dll_SearchSolution =  (int( *)(char* info))GetProcAddress(hdDll,"SearchSolution");

接下來改使用 Dll_SearchSolution 取代原先的函數!解決!