不可能大家都不明白的!渴望大家的救助!!(DLL) (15分)

  • 主题发起人 主题发起人 hlfdsj
  • 开始时间 开始时间
H

hlfdsj

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:
如果一个工程有多个窗体,并且在多个窗体中都有可能会调用同一个DLL文件。
如果静态调用的话,应该在哪里声明该DLL文件中的所有函数?
而且只声明一次,就能在所有的窗体中实现对该DLL的调用。
谢谢!
 
数据模块
 
数据模块不是用来放置一些数据集、数据源控件的吗?
我不是很明白,你能不能说得详细些啊?
谢谢!
 
呵呵这个简单!
implementation
{$R *.dfm}
function StartHook(sender:HWND;MessageID:WORD):BOOL;stdcall;
external 'M_hookDll.DLL';
function StopHook:BOOL;stdcall;external 'M_hookDll.DLL';
procedure GetRbutton;stdcall;external 'M_hookDll.DLL';
function kStartHook:BOOL;stdcall;external 'M_hookDll.DLL';
function kStopHook:BOOL;stdcall;external 'M_hookDll.DLL';
 
楼上的,你可能没有明白我得意思。
如果在一个单元中声明如山你写的那些;
但是在别的单元中还是照样使用不了这些函数和过程啊。
我的意思是,如果在一个工程中只声明一次;之后不管我在任何一个窗体,任何一个时间都可以使用这些函数和过程。
明白了吗?
 
两种方法:
1、在每个单元都会自动引用的Windows单元或者Classes单元声明;
2、自己增加一个单元,专门用于声明这些函数,然后再你要调用的单元中Uses中引入即可。
 
楼上的:
之前我用过你所说的第二个单元,但是行不通。在别的单元中即使引用了该定义单元,
还是出错:找不到那些函数或者过程。
 
不会吧!!
你的DLL没问题吧!
 
应该没问题。如果该单元中声明了DLL,则在该单元中,所声明的函数和过程都可用啊,并且运行正确。
 
还有,DLL中的同一个函数A。
即使在同一个PROJECT的两个UNIT中都给予了声明,
为什么只有在主窗体(UNIT1)中运行正确;而在另一个窗体UNIT2中运行错误呢?
 
在主窗体设全局变量,尽管这种做法比较烂
 
//示例
unit YYGL_dllfun;
interface
//申明部分
procedure Qry_SickInfo(Aconnstr,ACompany_Name:string;AZyNo:string='');
//病员信息查询
procedure Qry_BedUsed(Aconnstr,ACompany_Name:string);
//床位使用情况查询
procedure Qry_Zy_pay(Aconnstr,ACompany_Name:string);
//住院缴费查询
implementation
//实现部分
procedure Qry_SickInfo(Aconnstr,ACompany_Name:string;AZyNo:string='');external 'ZyQry.dll';
procedure Qry_BedUsed(Aconnstr,ACompany_Name:string);external 'ZyQry.dll';
procedure Qry_Zy_pay(Aconnstr,ACompany_Name:string);external 'ZyQry.dll';
把此单元放到一个delphi能搜索到的路径,如%delphi%/lib里,或把此单元的路径回到
delphi的搜索路径里。这样多个工程引用时就不用增加这个单元到工程了,可以直接uses这个单元就行了
调用:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
uses YYGL_dllfun;//引用 包含dll函数的公共单元
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Qry_SickInfo(connstr,Company_Name,zyNo);
end;
end.
 
这是主窗体,引用DDL文件的部分大概如下。
unit Unit1;
interface
uses
type
private
public
function Read_Iodata(Sy_id:string;Iodata:string):integer;
function Read_Card(Sy_id:string;no:string;Card:string):integer;
end;
var
Form1: TForm1;
implementation
function Init_Com(comport:integer):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function Close_Com():integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function Read_Card(Sy_id:string;no:string;Card:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function Read_Iodata(Sy_id:string;Iodata:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function Alarm(Sy_id:string;voice:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
之后,我在第二个窗体中,移用应用了UNIT1这个单元。然后直接在单元中用了Read_Iodatahe和Read_Card这两个函数。
在编译时,错误如下:
[Error] Unit1.pas(28): Unsatisfied forward or external declaration: 'TForm1.Read_Iodata'
[Error] Unit1.pas(29): Unsatisfied forward or external declaration: 'TForm1.Read_Card'
[Fatal Error] Project1.dpr(7): Could not compile used unit 'Unit1.pas'
请问是什么原因?
 
这样:
unit Unit1;
interface
uses
type
private
public
function Read_Iodata(Sy_id:string;Iodata:string):integer;
function Read_Card(Sy_id:string;no:string;Card:string):integer;
end;
var
Form1: TForm1;
implementation
function TForm1.Init_Com(comport:integer):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function TForm1.Close_Com():integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function TForm1.Read_Card(Sy_id:string;no:string;Card:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function TForm1.Read_Iodata(Sy_id:string;Iodata:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function TForm1.Alarm(Sy_id:string;voice:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
更好是:
把dll文件的路径去掉,如
function TForm1.Init_Com(comport:integer):integer;stdcall;external 'syris.dll';
dll文件与exe在同一目录就行了,
 
这样吧:
unit Unit1;
interface
uses
type
private
public
end;
var
Form1: TForm1;
function Read_Iodata(Sy_id:string;Iodata:string):integer;
function Read_Card(Sy_id:string;no:string;Card:string):integer;
implementation
function Init_Com(comport:integer):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function Close_Com():integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
最好是定义个公共的单元
function Read_Card(Sy_id:string;no:string;Card:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function Read_Iodata(Sy_id:string;Iodata:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
function Alarm(Sy_id:string;voice:string):integer;stdcall;external 'E:/感应卡门禁系统/syrisdll/syris.dll';
 
这次出现的错误是:
[Error] Unit1.pas(43): Declaration of 'TForm1.Read_Card' differs from previous declaration
[Error] Unit1.pas(44): Declaration of 'TForm1.Read_Iodata' differs from previous declaration
[Fatal Error] Project1.dpr(7): Could not compile used unit 'Unit1.pas'
以前,我定义了一个共用单元,在其中声明DLL中的函数。但是在使用时,说没有声明这些函数。
 
说你的前后的声明不对,也就是说是声明部分的参数与实现部分的参数不一样
,把前后的参数个数及类型改一样就行了
 
问题是:不可能声明和实现不一致啊。
只有一个窗体时,我不在UNIT的PUBLIC部分定义函数时,直接静态调用DLL。
运行结果都是正确,而且和硬件配合,都能够正确读写数据的。
 
function Read_Iodata(Sy_id:string;Iodata:string):integer;
function TForm1.Read_Iodata(Sy_id:string;Iodata:string):integer;stdcall;external 'syris.dll';
我认为可能是前后两部分声明,后者较前者多了stdcall;external 'syris.dll';这部分的缘故。
不知道是不是?如果是的话,也就是方法还是有问题。
 
这样
function TForm1.Read_Iodata(Sy_id:string;Iodata:string):integer;external 'syris.dll';
 
后退
顶部