我用delphi 7.0开发一个数据采集程序要用到厂家提供的驱动
程序库aaa.dll,在Win2003 Server下调试、运行都没有任何问题,但是将程序
copy到Win2000 Server下调试,就提示:无法找到动态连接库aaa.dll位于指定路径
但是我已经将aaa.dll拷贝到系统目录下了,为什么找不到呢?不知道各位有没有遇到这样的问题,望不吝赐教!谢谢!
程序库aaa.dll,在Win2003 Server下调试、运行都没有任何问题,但是将程序
copy到Win2000 Server下调试,就提示:无法找到动态连接库aaa.dll位于指定路径
但是我已经将aaa.dll拷贝到系统目录下了,为什么找不到呢?不知道各位有没有遇到这样的问题,望不吝赐教!谢谢!
应该是环境的影响,不知道有没有什么好的解决办法?
在Win2003 Server环境下我只放在系统目录c:\winnt\system\aaa.dll下就可以了
调用完全没有问题
而Win2000 Server下,我也把以上方法都试过了,没有用,一调试照样提示:无法找到动态连接库aaa.dll位于指定路径!
我也很郁闷,明明路径下有aaa.dll,为什么它找不到???
错(调试通过的情况下),才用delphi做,用VB6不管在Win2003 Server
还是Win2000 Server环境下对aaa.dll的调用都没有问题,所以应该不会像
clasj(我蛮怀) 所说的那样
接着后面列出很多路径大家帮我分析一下可能是什么原因造成的(注意:只在2000下出错,2003下调试运行正常)
unit Main_Form;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
USB2001, StdCtrls; // 注意: 在此加入驱动程序接口单元USB2001
type
TMainForm = class(TForm)
CreateDevice_Sub: TButton;
ReadDeviceAD_Sub: TButton;
ReleaseDevice_Sub: TButton;
Edit1: TEdit;
WriteDataFile_Sub: TButton;
ReadDeviceFile_Sub: TButton;
Edit2: TEdit;
Edit3: TEdit;
procedure CreateDevice_SubClick(Sender: TObject);
procedure ReleaseDevice_SubClick(Sender: TObject);
procedure InitDeviceAD_SubClick(Sender: TObject);
procedure ReadDeviceAD_SubClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure WriteDataFile_SubClick(Sender: TObject);
procedure ReadDeviceFile_SubClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
MainForm: TMainForm;
hDevice:Integer;
Para:USB_PARA;
InUserRegion:Array[0..65536] of WORD;
Flag : Boolean;
hEvent: Integer;
hThreadData:Integer;
hThreadDraw:Integer;
implementation{$R *.DFM}procedure TMainForm.CreateDevice_SubClick(Sender: TObject);
var
InputString: string;
begin
hDevice:=USB2001_CreateDevice(0);if hDevice<>INVALID_HANDLE_VALUE then
Begin
CreateDevice_Sub.Enabled:=FALSE;
ReadDeviceAD_Sub.Enabled:=TRUE;
ReleaseDevice_Sub.Enabled:=TRUE;
End;
end;procedure TMainForm.ReleaseDevice_SubClick(Sender: TObject);
begin
flag:=FALSE;
USB2001_ReleaseDevice(hDevice);
CreateDevice_Sub.Enabled:=TRUE;
ReadDeviceAD_Sub.Enabled:=FALSE;
ReleaseDevice_Sub.Enabled:=FALSE;
end;procedure TMainForm.InitDeviceAD_SubClick(Sender: TObject);
begin
// 在此设置参数CreateDevice_Sub.Enabled:=FALSE;
ReadDeviceAD_Sub.Enabled:=TRUE;
ReleaseDevice_Sub.Enabled:=TRUE;
end;function ThreadDataProc(Cache: Pointer): Integer;
var
Cnt:Integer;
i:Integer;
V: Variant;
begin
Result := 1;
i:=0;
flag:=TRUE;
Para.FirstChannel:=0;
Para.LastChannel:=7;
Para.Frequence:=10000;
Para.Gains:=1;
USB2001_InitDeviceAD(hDevice, @Para);
while flag do
begin
USB2001_ReadDeviceAD(hDevice, @InUserRegion, 1024); // 读USB设备上的AD数据
SetEvent(hEvent); // 通知数据显示线程,可以显示新的一批数据
end;
EndThread(Result);
end;function ThreadDrawProc(Cache: Pointer): Integer;
var
i:Integer;
str:String;
begin
Result := 1;
i:=0;
flag:=TRUE;
while flag do
begin
str:='';
WaitForSingleObject(hEvent, INFINITE);
for i:=0 to 7 do
Begin
str:=str+IntToStr(((InUserRegion[i] ) xor $8000))+'Lsb'+' ';
End;
MainForm.Edit1.Text:=str;
end;
EndThread(Result);
end;procedure TMainForm.ReadDeviceAD_SubClick(Sender: TObject);
Var
ThreadID: DWORD;
begin
// 创建子线程
hEvent:=USB2001_CreateSystemEvent();
//hThreadData := BeginThread(nil, 0, @ThreadDataProc, Pointer(Self), 0, ThreadID);
//hThreadDraw := BeginThread(nil, 0, @ThreadDrawProc, Pointer(Self), 0, ThreadID);
// 同上
USB2001_CreateVBThread(@hThreadData, @ThreadDataProc); // 创建数据采集子线程
ResumeThread(hThreadData);USB2001_CreateVBThread(@hThreadDraw, @ThreadDrawProc); // 创建数据显示子线程
ResumeThread(hThreadDraw);
CreateDevice_Sub.Enabled:=FALSE;
ReadDeviceAD_Sub.Enabled:=FALSE;
ReleaseDevice_Sub.Enabled:=TRUE;
end;procedure TMainForm.FormCreate(Sender: TObject);
begin
CreateDevice_Sub.Enabled:=TRUE;
ReadDeviceAD_Sub.Enabled:=FALSE;
ReleaseDevice_Sub.Enabled:=FALSE;Edit3.Text:='1';
end;
procedure TMainForm.WriteDataFile_SubClick(Sender: TObject);
var
FileName:string;
hDevice : Integer;
begin
FileName:='d.dat';
hDevice :=USB2001_CreateDevice(0);
USB2001_InitDeviceFile(hDevice, FileName, 0, modeCreate or modeWrite);
InUserRegion[0]:=StrToInt(MainForm.Edit3.Text);
USB2001_WriteDataFile(hDevice,@InUserRegion,1024, 0);
USB2001_ReleaseDeviceFile(hDevice, 0);
USB2001_ReleaseDevice(hDevice);
end;procedure TMainForm.ReadDeviceFile_SubClick(Sender: TObject);
Var
FileName:string;
hDevice : Integer;
begin
FileName:='d.dat';
hDevice :=USB2001_CreateDevice(0);
USB2001_InitDeviceFile(hDevice, FileName, 0, modeRead);
InUserRegion[0]:=0; // 设定初值,以确保读入的数据正确
USB2001_ReadDeviceFile(hDevice,@InUserRegion,0,1024, 0);
MainForm.Edit2.Text:=IntToStr(InUserRegion[0]);
USB2001_ReleaseDeviceFile(hDevice, 0);
USB2001_ReleaseDevice(hDevice);
end;end.
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type // 定义结构体数据类型
PUSB_PARA = ^USB_PARA; // 数据类型名('^'符号用于取指针)
USB_PARA = record // 标记为记录型
FirstChannel: DWORD;
LastChannel: DWORD;
Frequence: DWORD;
Gains: DWORD;
end;const INVALID_HANDLE_VALUE: Integer = -1;
const INFINITE:Integer=$FFFFFFFF;//***********************************************************
// InitDeviceFile所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
const modeRead:LongWord=$0000; // 只读文件方式
const modeWrite:LongWord=$0001; // 只写文件方式
const modeReadWrite:LongWord=$0002; // 既读又写文件方式
const modeCreate:LongWord=$1000; // 如果文件不存可以创建该文件,如果存在,则重建此文件,并清0
const InitDeviceFileError:LongWord=$e4040000; // 初始文件系统出错
// 驱动程序接口函数定义
function USB2001_CreateDevice(DeviceID:Integer):Integer; stdcall; external 'USB2001' name 'USB2001_CreateDevice';
function USB2001_InitDeviceAD(hDevice : Integer; pParameter:PUSB_PARA):Boolean; stdcall; external 'USB2001' name 'USB2001_InitDeviceAD';
function USB2001_ReadDeviceAD(hDevice : Integer; pInUserRegion : PWordArray; ReadSizeBytes:LongWord):Boolean; stdcall; external 'USB2001' name 'USB2001_ReadDeviceAD';
function USB2001_ReleaseDevice(hDevice : Integer):Boolean; stdcall; external 'USB2001' name 'USB2001_ReleaseDevice';function USB2001_LoadParameter(hDevice : Integer; pParameter:PUSB_PARA):Boolean; stdcall; external 'USB2001' name 'USB2001_LoadParameter';
function USB2001_SaveParameter (hDevice : Integer; pParameter:PUSB_PARA):Boolean; stdcall; external 'USB2001' name 'USB2001_SaveParameter ';
function USB2001_SetupParameterDlg (hDevice : Integer; pParameter:PUSB_PARA):Boolean; stdcall; external 'USB2001' name 'USB2001_SetupParameterDlg ';
function USB2001_InitDeviceFile(hDevice : Integer; NewFileName: string; nFileID:Integer; Mode: Integer):Boolean; stdcall; external 'USB2001' name 'USB2001_InitDeviceFile';
function USB2001_WriteDataFile(hDevice : Integer; pUserRegion:PWordArray; nWriteSizeBytes: LongWord; nFileID:Integer):Boolean; stdcall; external 'USB2001' name 'USB2001_WriteDataFile';
function USB2001_ReadDeviceFile(hDevice : Integer;pUserRegion:PWordArray;OffsetBytes:LongWord; nReadSizeBytes:LongWord; nFileID:Integer):Boolean; stdcall; external 'USB2001' name 'USB2001_ReadDeviceFile';
function USB2001_ReleaseDeviceFile(hDevice : Integer; nFileID:Integer):Boolean; stdcall; external 'USB2001' name 'USB2001_ReleaseDeviceFile';function USB2001_CreateVBThread(hThread : Pointer; RoutineAddr:TThreadFunc):Boolean; stdcall; external 'USB2001' name 'USB2001_CreateVBThread';
function USB2001_TerminateVBThread(hDevice : Integer):Boolean; stdcall; external 'USB2001' name 'USB2001_TerminateVBThread';
function USB2001_CreateSystemEvent():Integer; stdcall; external 'USB2001' name 'USB2001_CreateSystemEvent';function ResumeThread(hThread : Integer):LongWord; stdcall; external 'kernel32' name 'ResumeThread';
function SuspendThread(hThread : Integer):LongWord; stdcall; external 'kernel32' name 'SuspendThread';
function WaitForSingleObject(hEvent : Integer; dwMilliseconds:integer):Integer; stdcall; external 'kernel32' name 'WaitForSingleObject';
function SetEvent(hEvent : Integer):Integer; stdcall; external 'kernel32' name 'SetEvent';implementation // 以下是代码执行体,在此无
end.program Sys;uses
Forms,
Main_Form in 'Main_Form.pas' {MainForm},
USB2001 in 'USB2001.pas';{$R *.RES}begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
2,dll的扩展名加上和删除都试验下(aaa和aaa.dll),并且保证dll的文件名区分大小写.