请教大家一个问题(50分)

  • 主题发起人 主题发起人 wxf_wxf
  • 开始时间 开始时间
W

wxf_wxf

Unregistered / Unconfirmed
GUEST, unregistred user!
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "uTestDll.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
typedefdo
uble(SQRT1)(double);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
HINSTANCE hInstance;
SQRT1* pFunction;
hInstance=::LoadLibrary("PrjDll.dll");
pFunction=(SQRT1*)GetProcAddress(hInstance,"sqrt1");
if (pFunction==NULL) exit;
do
uble d=(*pFunction)(81.0);//调用该DLL函数
Label1:Caption=FloatToStr(d);
}
我所取的pFunction为何为NULL;我的PrjDll.dll和sqrt1都是对的
 
hInstance是有效的吗?如果是的话,就要看函数的定义与其在DLL源文件中的定义是否一致。如果DLL是用CB做的,建议使用__stdcall关键字,这样才可以被VC调用。
假设DLL源文件中的函数定义是:
extern "C" __declspec(dllexport)do
uble __stdcall sqrt1(double Value);
调用的时候可以这样定义:
typedefdo
uble (__stdcall *_SQRT1)(double);
HINSTANCE hDLL;
_SQRT1 SQRT1;
hDLL = LoadLibrary("PrjDLL.dll");
if (hDLL){
SQRT1 = (_SQRT1)GetProcAddress(hDLL, "sqrt1");
if (SQRT1){
do
uble d = SQRT1(81.0);
Caption = d;
}else
MessageBox(0, "函数导入失败!","",MB_ICONERROR);
}else
MessageBox(0, "无法加载动态链接库!","",MB_ICONERROR);
FreeLibrary(hDLL);
 
同意楼上:
楼主主要是
typedefdo
uble (* _SQRT1)(double);
_SQRT1 SQRT1;
没有搞清楚.
 
接受答案了.
 
后退
顶部