读书人

调用bpl,该如何解决

发布时间: 2012-03-18 13:55:39 作者: rapoo

调用bpl
新建一个package
#pragma hdrstop
#include "Unit1.h"
USEFORM("Unit1.cpp", Form1);
//---------------------------------------
#pragma package(smart_init)
//---------------------------------------

// Package source.
//---------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
if (reason == 1)
{
Form1 = new TForm1(Application);
}
return 1;
}

然后新建一个工程 调用
//---------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned int fHandle = LoadPackage("Package1.bpl");
if(fHandle)
{
//行包中的函
typedef PACKAGE void __stdcall TMyFun(HINSTANCE hinst, unsigned long reason, void*);
TMyFun* MyFun= (TMyFun*)GetProcAddress((HINSTANCE)fHandle, "DllEntryPoint");
if(MyFun)
MyFun((HINSTANCE)fHandle, 1, NULL);
}
}

得不到函数地址。。
何解。。

[解决办法]
你的DllEntryPoint和TMyFun的定义不同,DllEntryPoint没有__stdcall修饰么

你在bpl中再新增一个函数实现那些功能,然后在程序中再调用。
[解决办法]
bpl中

C/C++ code
extern "C"  __declspec(dllexport)  int     __stdcall TestFun  (int type){    ShowMessage(type);}
[解决办法]
DllEntryPoint这个函数不用你调用,LoadPackage时自动会调用的
[解决办法]
UnloadPackage(fHandle);就可以了

读书人网 >C++ Builder

热点推荐