论坛风格切换切换到宽版
  • 5006阅读
  • 23回复

帮忙看一下为什么会出现Can't import DLL,谢谢 [复制链接]

上一主题 下一主题
离线546242502
 

发帖
332
金钱
-3060
威望
-306
只看楼主 倒序阅读 0 发表于: 2015-08-04




[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma
SolidCompression=yes
UserInfoPage=true
DefaultUserInfoName=
DefaultUserInfoOrg=
DefaultUserInfoSerial=

[Files]
Source: MyProg.exe; DestDir: {app}
Source: MydLL.DLL; fLAGS:dontcopy
Source: Readme.txt; DestDir: {app}; Flags: isreadme

[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe



[Code]
function MyDllFunc3(lpText1, lpText2, lpCaption: String) : integer;
  external 'MyDllFunc3@files:MyDll.dll stdcall';
function MyDllAT : integer;
  external 'MyDllAT@files:MyDll.dll stdcall';

function CheckSerial(Serial: String): Boolean;
var
    i: integer;
    sUser, sCompany: string;
    ask: Boolean;
begin
    sUser := ExpandConstant('{userinfoname}');
    sCompany := ExpandConstant('{userinfoorg}');
    if CompareStr('', Serial) = 0 then Serial := 'DEMO';
    if CompareStr('DEMO', Serial) = 0 then
        Result := True
    else begin
        i := 0;
        i := MyDllFunc3(sUser, sCompany, Serial);
        ask := i > 0;
        Result := ask;
    end;
end;
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 1 发表于: 2015-08-07
你肯定文件 MydLL.DLL 被打包了吗?
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 2 发表于: 2015-08-07
回 1楼(gnatix) 的帖子
gnatix:你肯定文件 MydLL.DLL 被打包了吗? (2015-08-07 02:48) 

恩,打包了,不过我的系统是W7 x64,不知道是不是不支持64位系统,插件是2003的版本
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 3 发表于: 2015-08-07


有许多以前的脚本,我测试都是不能加载dll?

老虎版主,不久前看到您给别人解答的《显示MAC网卡物理地址 》一贴,为什么到我这里乱码?


离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 4 发表于: 2015-08-09
关于 DLL 不能加载的问题,我不能回答你,因为不知道你具体的文件。

关于显示 MAC 地址乱码的问题,估计你使用的 INNO 是 Unicode 版本的原因,而我给的示例代码是给 ANSI 版本的。在 Unicode 版本的 INNO 下编译,你试试下面的代码看看:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Files]
Source: "ISID.dll"; Flags: dontcopy

[Code]
function GetMACAddress(output: AnsiString): Integer;
external 'GetMACAddress@files:ISID.dll stdcall';

function GetMacAdd: AnsiString;
var
  ClassName: AnsiString;
  Ret: Integer;
begin
  SetLength(ClassName, 256);
  Ret := GetMacAddress(PAnsiChar(ClassName));
  Result := Copy(ClassName, 1 , Ret);
end;

procedure InitializeWizard();
var
  labMacAdd: TLabel;
begin
  WizardForm.WelcomeLabel2.Height := ScaleY(200);
  labMacAdd := TLabel.Create(WizardForm);
  with labMacAdd do
  begin
    Parent := WizardForm.WelcomePage;
    Caption := 'MAC 地址: ' + GetMacAdd;
    Transparent := False;
    Left := ScaleX(174);
    Top := ScaleY(280);
    Width := ScaleX(120);
    Height := ScaleY(12);
  end;
end;
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 5 发表于: 2015-08-09
回 4楼(gnatix) 的帖子
感谢老虎版主的解答,现在正常了:


离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 6 发表于: 2015-08-09
回 4楼(gnatix) 的帖子

老虎版主,想问下,只要是Unicode 版本就需要将
String换成AnsiString
么?
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 7 发表于: 2015-08-09
回 4楼(gnatix) 的帖子
老虎版主,还有就是上面那个 Mydll.dll 的脚本文件,请您帮我看看
j脚本文件 脚本测试.zip (4 K) 下载次数:4
离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 8 发表于: 2015-08-09
我检查了你这个 Mydll.dll 文件,它只有一个导出函数,而且名称是 MyDllFunc。而你非要从它那里导入 MyDllFunc3 和 MyDllAT 这两个函数,所以出现不能导入的出错信息。

你修改你要导入函数的代码:
[Code]
function MyDllFunc3(lpText1, lpText2, lpCaption: String) : integer;
  external 'MyDllFunc@files:MyDll.dll stdcall';
//  external 'MyDllFunc3@files:MyDll.dll stdcall';
//function MyDllAT : integer;
//  external 'MyDllAT@files:MyDll.dll stdcall';

附注:你可以使用 ExeScope 这个工具检查库文件里面的导出函数。

离线gnatix

发帖
7696
金钱
-8279
威望
-828
只看该作者 9 发表于: 2015-08-10
回 6楼(546242502) 的帖子
546242502:老虎版主,想问下,只要是Unicode 版本就需要将String换成AnsiString么? (2015-08-09 18:42)

INNO 帮助文件中有专门讲 Unicode 版本的内容,你可以系统地看看。

发现楼主的诸多问题的原因是自己对 INNO 的代码还不熟悉,而直接把 ANSI 版本的代码用到 Unicode 版本下出现的问题,所以楼主是否可以考虑一下是否一定有必要用 Unicode 版本的 INNO。在目前对代码还不熟悉,而又必须直接套用第三方代码的情况下,使用 ANSI 版本的 INNO 出现错误的可能性要小些,因为论坛上的大多数示例代码都是在 ANSI 版本下的。  

关于什么情况下用 Ansi 版本或者 Unicode 版本,请参看:
http://bbs.hanzify.org/read-htm-tid-98317-ds-1-page-1.html