當前位置:首頁 » 編程軟體 » bcb工程編譯Delhi代碼

bcb工程編譯Delhi代碼

發布時間: 2023-05-18 09:45:39

1. win7 下BCB調用 BCB編寫的DLL

1. 靜態調用 DLL
使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中
將該文件拷貝到當前目錄,使用宏轎 implib MyDll.lib MyDll.dll 生成
// Unit1.h // TForm1 定義
#include "DllForm.h" // TDllFrm 定義
//---------------------------------------------------------------------------
__declspec(dllimport) class __stdcall MyDllClass {
public:
MyDllClass();
void CreateAForm();
TDllFrm* DllMyForm;
};
extern "C" __declspec(dllimport) __stdcall void CreateFromFunct();

class TForm1 : public TForm{...}

// Unit1.cpp // TForm1 實現
void __fastcall TForm1::Button1Click(TObject *Sender)
{ // 導出類實現,導出類只能使用靜態方式調用
DllClass = new MyDllClass();
DllClass->CreateAForm()
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // 導出函數實現
CreateFromFunct();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete DllClass;
}
2. 動態調用 DLL
// Unit1.h
class TForm1 : public TForm
{
...
private: // User declarations
void (__stdcall *CreateFromFunct)();
...
}
// Unit1.cpp // TForm1
HINSTANCE DLLInst = NULL;
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if( NULL == DLLInst ) DLLInst = LoadLibrary("DLL.dll"); //上面的 Dll
if (DLLInst) {
CreateFromFunct = (void (__stdcall*)()) GetProcAddress(DLLInst,
"CreateFromFunct");
if (CreateFromFunct) CreateFromFunct();
else ShowMessage("Could not obtain function pointer");
}
else ShowMessage("Could not load DLL.dll");
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if ( DLLInst ) FreeLibrary (DLLInst);
}
3. DLL 作為 MDIChild (子窗體) 【只編寫動態調用的例子】
實際上,調用子窗體的 DLL 時,系統只困梁是檢查應蔽尺肆用程序的 MainForm 是否為 fsMDIForm 的窗體,這樣只要把調用程序的 Application 的 Handle 傳遞給 DLL 的 Application 即可;同時退出 DLL 時也要恢復
// MDIChildPro.cpp // Dll 實現 CPP
#include "unit1.h" // TForm1 定義
TApplication *SaveApp = NULL;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{

if ( (reason==DLL_PROCESS_DETACH) && SaveApp )

Application = SaveApp ; // 恢復 Application

return 1;
}

extern "C" __declspec(dllexport) __stdcall void TestMDIChild(
//1024X768

TApplication* mainApp,

LPSTR lpCaption)
{
if ( NULL == SaveApp ) // 保存 Application,傳遞 Application
{
SaveApp = Application;
Application = mainApp;
}
// lpCaption 為子窗體的 Caption
TForm1 *Form1 = new TForm1 ( Application, lpCaption );
Form1->Show();
}
註:上面的程序使用 BCB 3.0 編譯成功
4. BCB 調用 VC 編寫的 DLL
1. 名字分解:
沒有名字分解的函數
TestFunction1 // __cdecl calling convention
@TestFunction2 // __fastcall calling convention
TESTFUNCTION3 // __pascal calling convention
TestFunction4 // __stdcall calling convention
有名字分解的函數
@TestFunction1$QV // __cdecl calling convention
@TestFunction2$qv // __fastcall calling convention
TESTFUNCTION3$qqrv // __apscal calling convention
@TestFunction4$qqrv // __stdcall calling convention<br

2. 一段C語言在BCB中編譯的代碼,求解釋

char buffer[1024] = {0}; //定義並賦初值為全0
#pragma resource "*.dfm" //資源定義在各個dfm為擴展名的文件中
TForm1 *Form1; //定義一個指向TForm1窗體對象的指針
(->) 仿問指針所指對象的元素的訪問運算符,與點(.)相對應,就是一個減號加一個大於號連寫在一尺碼起,使用類的指針,結構體指針和聯合體指針,就經常會用到這個指向訪問運算符啊,這個運算符可不是BCB特有的,是C語方和C++共有的,不認得它說明你C的基礎不牢靠啊
#include <vcl.h> //包含頭文件 vcl.h 它是什麼庫的頭文件,我也不曉得咧
BCB與VC就所用的語言來講都是標準的C/C++,沒有區別,但是在資源的定義上,工程的處理上,窗體、資源與代碼的關聯上、集成環境的使用上都是完全不同的
BCB到6.0之後還有沒有繼續升級我不曉得,但是Bland公衫困塌司已尼倒閉不再有後繼支持了,若不是手頭還有舊的BCB項目要繼續維護話,新手是沒有必要學習使用BCB來開發了,windows下的C/C++編程用VS20XX系列夠用了,舊到VC6,新到VS2011,學習或或圓開發都是可用的。

我最近五到六年裡都一直只用VS2003(VC7.1),偶而也用BCB6.0(那是因為公司有一個舊項目是BCB開發的框架,做界面時是比VC7.1省事快捷此),在此之前,我還用了好多年的VC6和TC3.0呢,初學時我用的是TC2.0+DOS3.3/DOS6.22,現在我轉行了,16位的32位和64位的都不做而改做8位的C51程序了,這是進化還是退化了呢? 呵呵,羅嗦太多了

熱點內容
安卓手機哪個版本適合玩游戲 發布:2025-07-15 17:12:31 瀏覽:57
安裝flexlinux 發布:2025-07-15 16:35:47 瀏覽:372
網站模板php 發布:2025-07-15 16:22:47 瀏覽:248
編譯簡譜 發布:2025-07-15 16:16:37 瀏覽:813
編程口是什麼 發布:2025-07-15 16:11:28 瀏覽:497
微博如何從賬號和密碼登錄 發布:2025-07-15 15:59:02 瀏覽:123
解說電影需要哪些硬體配置 發布:2025-07-15 15:56:59 瀏覽:380
ftp快捷鍵搜索文件 發布:2025-07-15 15:51:44 瀏覽:459
蘋果賬號密碼忘了怎麼注銷 發布:2025-07-15 15:30:50 瀏覽:200
自動閱讀掛機腳本 發布:2025-07-15 15:20:18 瀏覽:848