C++ Builder中创建与调用动态库文件小结

来源:互联网 发布:中级程序员2018 编辑:程序博客网 时间:2024/06/03 21:35

C++ BUILDER 中创建DLL文件:
    在工程中新建DLL WIZARD项目;
    选择C++与VCL及VC++
    在DLL工程中声明DLL文件的输出函数
    extern "C" __declspec(dllexport) TYPE FUNCTIONNAME(TYPE PARAMETERS,...);
    实现函数体
    如有DATA MODULE需要进行初始化
    如:
      if(dm==NULL) Application->CreateForm(__classid(TDmeOperationApply), &DmeOperationApply);
    并在DATA MODULE中将其初始值设为NULL
    如:TDmeOperationApply *DmeOperationApply=NULL;

示例:
void CreateDme(void);
extern "C" __declspec(dllexport) bool InStart(void * ADOConnection); //输出函数声明
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
    return 1;
}
//---------------------------------------------------------------------------

bool InStart(void * ADOConnection)
{

 try{
     CreateDme();
     DmeOperationApply->ADOConnection1=(TADOConnection *)ADOConnection;
     TForm * pForm =new TFormMain(NULL);
     pForm->ShowModal();
     delete pForm;
     return true;
 }
 catch(Exception &e){
     Application->ShowException(&e);
     return false;
 }

}
           //初始化DM
void CreateDme(void)
{
 if ( DmeOperationApply == NULL )
     Application->CreateForm(__classid(TDmeOperationApply), &DmeOperationApply);

}

   


C++ BUILDER 中DLL文件动态调用:

     声明DLL文件的声明函数
     如:bool  (*InStart)(void *);
     自定义类型:
     如:typedef bool (*InStartp)(void *);
     定义DLL实例(全局)
     如:HINSTANCE h_dll;
    
示例:

bool  (*InStart)(void *); //声明DLL文件的声明函数
//typedef
typedef bool (*InStartp)(void *);//自定义类型

void __fastcall FormatErrorMsg()
{
    LPVOID lpMsgBuf;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL
    );
    // Display the string.
    MessageBox( NULL,(LPCSTR) lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
    // Free the buffer.
    LocalFree( lpMsgBuf );
}


//---------------------------------------------------------------------------
__fastcall TFormCallMain::TFormCallMain(TComponent* Owner)
    : TForm(Owner)
{
    h_dll = NULL;
    InStart = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TFormCallMain::FormShow(TObject *Sender)
{
    if(h_dll==NULL)
       h_dll = LoadLibrary("OperationApply.dll");

    if(h_dll){     //  (bool (*InStart)(void*))
          InStart=(InStartp)::GetProcAddress(h_dll,"_InStart");//在调用函数名前加“_”
          if(InStart) InStart(ADOConnection1);
          else{
              FormatErrorMsg();
              return;

          }
    }
    else{
         FormatErrorMsg();
         return;
    }

}
//---------------------------------------------------------------------------

void __fastcall TFormCallMain::FormDestroy(TObject *Sender)
{
    if (h_dll != NULL ){
        FreeLibrary(h_dll);
    }
}
//---------------------------------------------------------------------------

void __fastcall TFormCallMain::Button1Click(TObject *Sender)
{
    ::CoInitialize(NULL);
    InStart(ADOConnection1);
    ::CoUninitialize();
}