关于资源文件中DLL调用的问题-标题说不清,请进帖子
许久不用BCB,最近需要写段代码,要求只生成一个单一的EXE文件。
但是,这个EXE文件需要调用一个外部的DLL文件。
于是想到将此DLL文件作为资源文件包含在编译后的EXE文件中,在EXE文件运行时释放出DLL,用以调用。
DLL文件中封装了许多类,我在BCB窗口中声明这些类必须是全局类型,即窗口中各控件的事件均可以访问这些变量。
例如:DLL中封装了类CLASS_A,我在BCB中声明 CLASS_A MY_CLASS_A;此MY_CLASS_A我需要在窗口中的很多事件中调用,我只能将它声明为全局类型的变量。
代码编译没有问题。EXE路径下不存在资源中的DLL文件时运行,报找不到XXX.DLL(资源中的DLL文件),程序无法运行。
如果EXE路径下存在资源中的DLL文件(不需要释放资源文件),则程序运行正常。
替代方案倒是有,可以在此EXE外再加壳,不过这样似乎很难接受。
晕菜。难道需要动态创建全局变量?还是有其他的解决方法?请大家指教。谢谢XDJM了。
代码片段
#include <vcl.h>
#pragma hdrstop
#include "frmMain.h"
#include "IFSFNDBAS.h"
#pragma comment(lib,"ifsfndbas.lib")
#define DLLFILE "IFSFNDBAS.DLL"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
IFSFndUser MyFndUser; //实例化DLL中定义的类--出问题的地方
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{//释放DLL
if (!FileExists(ExtractFilePath(Application->ExeName)+DLLFILE))
{
TResourceStream &rs1 = *new TResourceStream( (int)HInstance, AnsiString("IFSDLL"),"DLLFILE" ) ;
try
{
rs1.SaveToFile( AnsiString(DLLFILE) ) ;
delete &rs1 ;
}
catch(...)
{
delete &rs1 ;
}
}
else
{
;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MyFndUser.XXX();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
MyFndUser.YYY();
}