+ -
当前位置:首页 → 问答吧 → 调用bpl

调用bpl

时间:2011-12-20

来源:互联网

新建一个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);
  }
}

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

作者: maliang799   发布时间: 2011-12-20

你的DllEntryPoint和TMyFun的定义不同,DllEntryPoint没有__stdcall修饰么

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

作者: ksrsoft   发布时间: 2011-12-21

bpl中
C/C++ code

extern "C"  __declspec(dllexport)  int     __stdcall TestFun  (int type)
{
    ShowMessage(type);
}



调用:
C/C++ code

  typedef PACKAGE void __stdcall TMyFun(int type);
  TMyFun* MyFun= (TMyFun*)GetProcAddress((HINSTANCE)h, "TestFun");
  if(MyFun)
  MyFun(1);

作者: ksrsoft   发布时间: 2011-12-21

直接调用那个函数不行的么 那个函数是New->Other->Package 自动生成的

作者: maliang799   发布时间: 2011-12-21

DllEntryPoint这个函数不用你调用,LoadPackage时自动会调用的

作者: ksrsoft   发布时间: 2011-12-21

引用 4 楼 ksrsoft 的回复:
DllEntryPoint这个函数不用你调用,LoadPackage时自动会调用的

那我loadpackage的时候new了Form1的啊
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  ShowMsg();
}  
//---------------------------------------------------------------------------
void TForm1::ShowMsg()
{
  ShowMessage(1); 
}

作者: maliang799   发布时间: 2011-12-21

行了。。调用了怎么释放,我窗体关闭的时候出现地址错误

作者: maliang799   发布时间: 2011-12-21

UnloadPackage(fHandle);就可以了

作者: ksrsoft   发布时间: 2011-12-21