公司软件加密
采用的是硬件加密狗+软件控制 加密狗通讯是用的一个用delphi写的DLL 问题就出现在这个上面 
现在已基本完成..在开发环境下什么问题都没有 一切顺利 但一发布 有的系统就报错“外部组件出现异常”
这是出现在(Gost版下的Window XP SP2 个人版)IIS 5.1
但我很奇怪 在另外一台机器上(Win2000 企业版 + IIS 5.1)却什么问题都没有鄙人菜鸟..瞎猜两个原因
第一 我自己的程序问题
/// <summary>
/// 外部Dll注册基类
/// </summary>
public class ImportDLL
{
    [DllImport("kernel32.dll")]
    private extern static IntPtr LoadLibrary(String path);    [DllImport("kernel32.dll")]
    private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);    [DllImport("kernel32.dll")]
    private extern static bool FreeLibrary(IntPtr lib);    private IntPtr hLib;    public ImportDLL(String DLLPath)
    {
        hLib = LoadLibrary(DLLPath);
    }    ~ImportDLL()
    {
        FreeLibrary(hLib);
    }    /// <summary>
    /// 将要执行的函数转换为委托
    /// </summary>
    /// <param name="APIName">转换函数名称(DLL中的)</param>
    /// <param name="t">类型</param>
    /// <returns></returns>
    public Delegate Invoke(String APIName, Type t)
    {
        IntPtr api = GetProcAddress(hLib, APIName);
        return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
    }
}
/// <summary>
/// JBCUKey(加密狗)
/// </summary>
public partial class JBCUkey
{
    private ImportDLL dll;    /// <summary>
    /// 加密狗
    /// </summary>
    /// <param name="Path">文件路径</param>
    public JBCUkey(string Path)
    {
        dll = new ImportDLL(Path);
    }
    /// <summary>
    /// 读取密文模块权限值
    /// </summary>
    /// <param name="UkeyInfo">密文</param>
    /// <param name="ModuleId"> 模块ID
    /// (1门禁管理;
    /// 2考勤管理;3薪资管理;4收费管理;5记次收费;
    /// 6会议签到;7停车管理;8宿舍管理)</param>
    /// <param name="ReturnValue">返回值0/-1</param>
    /// <returns></returns>
    /// 
    public delegate int ChkModuleGrant
        (
        [MarshalAs(UnmanagedType.LPArray)] char[] UkeyInfo,
        int ModuleId
        );//编译加密狗权限检测    public delegate int GetAllowClient
        (
        [MarshalAs(UnmanagedType.LPArray)] char [] UkeyInfo,ref  int AllowClient
        );//编译加密狗客户端数量检测    /// <summary>
    /// 检查权限
    /// </summary>
    /// <returns>0/-1</returns>
    public int CheckPopem(string UkeyInfo, int ModuleId)
    {
        ChkModuleGrant compile = (ChkModuleGrant)dll.Invoke("ChkModuleGrant", typeof(ChkModuleGrant));
        int Popem =-1;//默认为无权限
        Popem = compile(UkeyInfo.ToCharArray(), ModuleId);
        return Popem;
    }
    /// <summary>
    /// 允许连接客户端数量
    /// </summary>
    /// <param name="UkeyInfo">密文</param>
    /// <returns>允许连接客户端数量</returns>
    public int GetClientNumber(string UkeyInfo,ref int AllowClient)
    {
        GetAllowClient gac = (GetAllowClient)dll.Invoke("GetAllowClient", typeof(GetAllowClient));
        int gcn = 0;//默认客户端为零
        gcn = gac(UkeyInfo.ToCharArray(), ref AllowClient);
        return gcn;
    }
    public void Dispose()
    {    }
}
这两段是基本的注册外部DLL文件的步骤 
程序里真正使用如下
       string DMText;//密文
       int UKClientNumber;//接受UK返回值
       JBCUK UK=new JBCUkey(Server.MapPath("bin/JBCUkey.dll")); 说明一下 这个DLL已经被我添加到Bin文件夹下
       UKResult = UK.GetClientNumber(DMText, ref UKClientNumber);第二点 就是 IIS配置的问题 这个问题 我真的是头大..实在搞不定 园子里有懂的兄弟没 。。 指点一下 。。
顶者都有分..等问题圆满解决 有需要这种加密方式的兄弟 可以找我要源码..包括那个delphi写的动态库..以及监控程序 统统提供源码(鄙人开源)

解决方案 »

  1.   

    ghost版的xp iis 很多都不好用
      

  2.   

    检查delphi写的DLL 的数据类型
      

  3.   

    MY GOD 
          真没有人搞过这个问题吗
    也许是那个DLL的问题  我用regsvr32.exe去注册这个DLL 一切正常 只是在注册完毕后 马上弹出一个内存不足的错误
      

  4.   

    我觉得还是不要用ghost系统
    我用ghost就出过好多问题
      

  5.   

    ghost版的xp,会把很多windows的运行库给去掉,导致安装或运行不正常,这种情况,一般来说只有换操作系统。当然,你要是大虾,能找出来缺少哪个文件,就更好了。
      

  6.   

    这是外部DLL直接添加 引用我试过 VS直接挂了 我最上面的两段代码就是在导入我自己写的外部DLL
      

  7.   

    干嘛自己搞呢,网上找找、应该不少,例如web虎