我用delphi 7.0开发一个数据采集程序要用到厂家提供的驱动
程序库aaa.dll,在Win2003 Server下调试、运行都没有任何问题,但是将程序
copy到Win2000 Server下调试,就提示:无法找到动态连接库aaa.dll位于指定路径
但是我已经将aaa.dll拷贝到系统目录下了,为什么找不到呢?不知道各位有没有遇到这样的问题,望不吝赐教!谢谢!

解决方案 »

  1.   

    是不是大小写的问题,调用dll时是区分大小写的
      

  2.   

    不会,因为在Win2003 Server环境下是可以运行的
    应该是环境的影响,不知道有没有什么好的解决办法?
      

  3.   

    把aaa.dll拷到当前目录下,试试?
      

  4.   

    还要注册一下在开始-〉运行里 regsvr32  c:\winnt\system32\aaa.dll
      

  5.   

    把DLL文件放到系统目录下看运行试试!../System32/aaa.dll
      

  6.   

    上面所说的方法我都试过了
    在Win2003 Server环境下我只放在系统目录c:\winnt\system\aaa.dll下就可以了
    调用完全没有问题
    而Win2000 Server下,我也把以上方法都试过了,没有用,一调试照样提示:无法找到动态连接库aaa.dll位于指定路径!
    我也很郁闷,明明路径下有aaa.dll,为什么它找不到???
      

  7.   

    而且我找了两台装了Win2000 Server的机器来试,结果都一样
      

  8.   

    这个dll可能就是在Win2003 Server环境下面开发的,用到了Win2003 Server里面特殊的东东,所以它不能向下兼容了。(猜测)就好像我以前用过一个prnadmin.dll一样,在2K以上里面用regsvr32注册很好,但是拿到98下面就提示找不到这个dll,后来一直没有解决。(请结哀)
      

  9.   

    忘了说明一点:开始的时候我们是用VB6来做的,后来因为VB6做多线程出
    错(调试通过的情况下),才用delphi做,用VB6不管在Win2003 Server
    还是Win2000 Server环境下对aaa.dll的调用都没有问题,所以应该不会像
     clasj(我蛮怀) 所说的那样
      

  10.   

    jx_bill(幽奇) 提出的问题应该也不会存在,在Win2003 Server下我就只把aaa.dll放到系统目录下就可以了,没有涉及其他的文件,厂家提供的说明书也没有提到
      

  11.   

    你确定就是这个LoadLibrary('aaa.dll')报错吗???
      

  12.   

    就是弹出一个提示:无法找到动态链接库aaa.dll位于指定的路径
    接着后面列出很多路径大家帮我分析一下可能是什么原因造成的(注意:只在2000下出错,2003下调试运行正常)
      

  13.   

    把你调用Dll的代码沾出来大家看看嘛!
      

  14.   

    代码有点长,请大家慢慢看!
    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.
      

  15.   

    unit USB2001;  // 单元名interfaceuses  // 使用的其他单元
      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.
      

  16.   

    1,是不是还有别的文件在dll里调用,并且没配置好路径。
    2,dll的扩展名加上和删除都试验下(aaa和aaa.dll),并且保证dll的文件名区分大小写.