使用 $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
1、文本当然没法运行了,只有经过编译的才能生成exe文件,只有exe文件才是可运行的。下个visul c++, 或 VS 2010 或turbo C 都是编译用的。2、使用C编译器编译为可执行文件。常见的编译器有MSC、VC、TC、BC、BCB、GCC、GC等等。C语言是不能解释运行的,必须先编译为可执行文件。vc生成的库文件在bcb下用需要转换成bcb的库文件,转换程序在bcb的bin目录下的coff2omf(dos程序)命令行下直接运行该程序提供有关帮助:C:\Program Files\Borland\CBuilder6\Bin>coff2omf
COFF to OMF Converter Version 1.0.0.74 Copyright (c) 1999, 2000 Inprise Corporat
ion
Syntax: COFF2OMF [options] InputFile OutputFile
-h, -? Display help
-q Quiet mode
-v Verbose mode
-r Remove (delete) output file if empty
-lib:xx Specify options for OMF import library generation:
ms - Allow entries that have MS C++ name mangling (default: no)
st - Normalize names instead of aliasing MS stdcall mangling
ca - Don't perform MS cdecl aliasing (default is to alias)
COFF2OMF will convert a COFF import library file (InputFile)
to the corresponding OMF type import library file (OutputFile).
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)