win7 下BCB调用 BCB编写的DLL

win7 下BCB调用 BCB编写的DLL,第1张

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

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).


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11600400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存