200分咨询有关DLL的几个问题(分两次给分)

WJBhome 2003-05-11 11:23:05
下面是kataboy给我的“调用DLL”的示范程序代码:

1。DLL.DLL的代码:
#include "YesNoUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TYesNofrm *YesNofrm;
//---------------------------------------------------------------------------
__fastcall TYesNofrm::TYesNofrm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool __stdcall YesNo()
{
bool bRet;
TYesNofrm *YesNofrm=new TYesNofrm(NULL);
YesNofrm->ShowModal();
bRet=YesNofrm->GetReturnValue();
delete YesNofrm;
return bRet;
}


bool TYesNofrm::GetReturnValue()
{
//TODO: Add your source code here
return returnvalue;
}
void __fastcall TYesNofrm::Button1Click(TObject *Sender)
{
returnvalue=true;
}
//---------------------------------------------------------------------------

void __fastcall TYesNofrm::Button2Click(TObject *Sender)
{
returnvalue=false;
}
2。动态调用的代码:
.h
typedef bool (dllYesNo)(void);
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *TESTButton;//★★可以被Dll.cpp用吗?
...........
.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE hdll;
bool bRet;
dllYesNo *YesNo;
hdll=LoadLibrary("dll.dll");
if (!hdll)
{
ShowMessage("没有找到动态连接库");
return;
}

YesNo=(dllYesNo*)GetProcAddress(hdll,"YesNo");

if (!YesNo)
{
ShowMessage("没找到函数!");
return;
}
-------------------------------------------------------
3。静态调用的代码:
TForm1 *Form1;
extern "C" __declspec(dllimport) bool __stdcall YesNo();

void __fastcall TForm1::Button1Click(TObject *Sender)
{
bool bRet;
bRet=YesNo();
if (bRet)
ShowMessage("Yes");
else
ShowMessage("No");
}

问题是:1.动态调用中的typedef bool (dllYesNo)(void);是什么?如果有参数是否可以这样写typedef bool (dllYesNo)(TObject * Sender, int num);?
2.静态调用的工程中要哪些设置?如何与DLL.DLL联系?
读了http://expert.csdn.net/Expert/topic/1171/1171316.xml?temp=.9920618
lingbin(林斌) :“你把.h文件#include到你的工程中,还有把.lib也Add to Project到你的工程中”
.h是否只要加"include path"即可?.lib如何Add to ?
3.如果在DLL.DLL的代码中要用主程序中的VCL或数据可以吗?如用TForm1->TESTButton;怎么用法?

...全文
59 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingbin 2003-05-15
  • 打赏
  • 举报
回复
你想调用DLL外的数据是可以的,不用只能用参数来传递,最好是变参。
WJBhome 2003-05-11
  • 打赏
  • 举报
回复
能答一下第3问吗?
3.如果在DLL.DLL的代码中要用主程序中的VCL或数据可以吗?如用TForm1->TESTButton;怎么用法?
ThinkX 2003-05-11
  • 打赏
  • 举报
回复
楼上的都说了,将lib和.h加入到Project很简单,直接加入就可以了
qibo999 2003-05-11
  • 打赏
  • 举报
回复
1.动态调用中的typedef bool (dllYesNo)(void);是定义了一个函数指针类型,指向一个无参数、返回bool的函数;

如果有参数是否可以这样写typedef bool (dllYesNo)(TObject * Sender, int num);?

不明白你要干什么?你当然也可以定义一个函数指针类型,指向一个有两个参数、返回bool的函数.


kataboy 2003-05-11
  • 打赏
  • 举报
回复
要这你想用客户端(主程序)的数据查询,我建议你最好用消息!
这些比较好!
Friecin 2003-05-11
  • 打赏
  • 举报
回复
将lib和.h加入到Project
wenmier 2003-05-11
  • 打赏
  • 举报
回复
up
bluedodo 2003-05-11
  • 打赏
  • 举报
回复
把你在主程序要用到的,要用关键字显式声明
lanren_me 2003-05-11
  • 打赏
  • 举报
回复
你可以把一个数据模块方到DLL中使用;

在DLL中不可以使用MainForm->ADOQuery.

qibo999 2003-05-11
  • 打赏
  • 举报
回复
第3个问题,好象不行,只能通过接口函数吧?
WJBhome 2003-05-11
  • 打赏
  • 举报
回复
可能我用了Button,第3个问题被弄糊涂了。

如果在.DLL的代码中要用主程序中的VCL或数据,如MainForm->ADOQuery,可以吗?
怎么用?
lanren_me 2003-05-11
  • 打赏
  • 举报
回复
3:应该可以的;
你在dll中发送一个自定义的消息;
在主程序捕获,然后调用你的那个过程;
Behard 2003-05-11
  • 打赏
  • 举报
回复
3:应该不行

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧