C++builer 如何像 VC 一样在 DLL 中导出类?(200分)

  • 主题发起人 主题发起人 xiao.lit
  • 开始时间 开始时间
X

xiao.lit

Unregistered / Unconfirmed
GUEST, unregistred user!
用过 VC 的人都知道,在 VC 中生成的 DLL 工程不但生成了一个 DLL 文件,而且生成了
一个 Lib 文件,这样,在使用 DLL 中的类的时候,只需要include它的头文件,并且
将Lib文件加入工程中即可实现。
这个功能在 CBuiler里面是怎么实现的呢?我找了很多资料都没有提到这样的实现方法
都是说怎么通过一个 C 接口来导出 DLL 中一个特定对象的某个函数。这在小的DLL中
是可以的,但是在大的 DLL 工程中简直是不可能,成千上万的成员函数总不能每一个
函数都要自己手工导出吧?
请教!!
 
跟 VC 好象没有什么很大区别呀!
我使用的是 BCB3.0,调试通过以下程序:
在 Exe 中加入 Dll 用 implib 生成的 lib 文件
//DllProject.cpp
#include <vcl.h>
#pragma hdrstop
#include "fsDllForm.h" //这个是打开一个空的窗口
USEFORM("fsDllForm.cpp", DllForm);
//---------------------------------------------------------------------------
class __declspec(dllexport) __stdcall RetDllClass
{
public:
RetDllClass();
void CreateAForm();
TDllForm *DllForm;
} ;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//---------------------------------------------------------------------------
RetDllClass::RetDllClass()
{
}
//---------------------------------------------------------------------------
void RetDllClass::CreateAForm()
{
DllForm = new TDllForm(Application);
DllForm->Show();
}
//---------------------------------------------------------------------------
//Exe.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "fsDllForm.h"
//---------------------------------------------------------------------------
__declspec(dllexport) class __stdcall RetDllClass
{
public:
RetDllClass();
void CreateAForm();
TDllForm *DllForm;
};
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
RetDllClass *RetDll ;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//ExeMainForm.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RetDll = new RetDllClass();
RetDll->CreateAForm();
}
//---------------------------------------------------------------------------
 
Behard兄: 你的方法如果dll生成和调用方都是 CB 的话,是可以实现的。
现在有以下几种情况:
1、有没有可能将 CB 生成的 dll 中的类让 VC 调用呢?
你的例子我试过了,不行。好像是 lib 文件的格式不对
2、VC生成的 DLL 在 CB 中怎么调用?
我的例子:
class VCDLL_API DllClassTest
{
public:
void Hello();
DllClassTest();
virtual ~DllClassTest();
};
生成 dll 后,然后 implib 生成 lib 文件。
在 CB 中调用的时候
[Linker Error] Unresolved external 'DllClassTest::DllClassTest()' referenced from D:/TEST/CBDLL_MAIN/UNIT1.OBJ
应该也是 dll 中 class 没有正确导出的原因。
再次请教,谢谢

 
改变一下编译的环境,在link选项中.
 
http://www.bcbdev.com/articles/bcbdll.htm
这里写的比较清楚
 
尽量不要用ansistring之类的东西,用指针。
导出时用extern c _declspec(dllexport) _stdcall
 
to zitai: 可以详细一点吗?
ljfree and wangxd:导出C函数我是知道的,我只不过是不明白如何导出类

 
多人接受答案了。
 
后退
顶部