2009-04-20 147 views
7

我们目前正在将我们的网站从Windows 2003(32位)转移到Windows 2008(64位),并出现问题。32位dll 64位操作系统与regsvr32.exe

我们的一个网站使用的支付网关汇丰CPI及须予注册的DLL(regsvr32.exe的),这个DLL,然后一个经典的ASP网站内部使用。问题是DLL是一个32位的DLL,因此它不会注册到Windows 2008操作系统。

会有如此,它的方法是暴露的,我们可以换一个C#.NET项目这32位DLL,可以与操作系统进行registerd的方法吗?

任何帮助将非常感激。

回答

5

你可以注册与C的regsvr32.exe的DLL:\ WINDOWS \ SysWOW64中的文件夹。

但是,由于无法混合使用64/32位代码,因此您必须创建一个在x86中运行的C#服务(请参阅项目属性,平台目标),然后您可以通过WCF从x64 Web应用程序使用该服务。

一个更简单的选择是向汇丰申请一个x64 dll。

+0

感谢克里斯这个作品。 不幸的是汇丰不支持64位操作系统。 – 2009-04-20 14:25:51

2

我们遇到了与HSBC Cpi接口相同的问题。

汇丰银行不提供.NET包装,和COM包装 不能从64位应用程序调用。

这使得从64服务器(这可能 占地面积新的生产服务器25%)几乎IMPOSIBLE上部署它。

我们看了一些上市的途径,但他们似乎 了很多工作。最后经过一番讨论后,我们 想出了我们自己的实现,这看起来像 这个。

使用下面的Java代码来获取中间值散列

import java.io.Console; 
import java.lang.*; 
import java.util.*; 
import com.clearcommerce.CpiTools.security.HashGenerator; 
import com.clearcommerce.CpiTools.security.SecCrypto; 
import javax.xml.bind.annotation.adapters.HexBinaryAdapter; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.Vector; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

public class Extract { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try 
     { 
      String encryptedKey = "<YOUR SECRET KEY HERE>"; 
      if (args.length == 1) 
       encryptedKey = args[0]; 

      HexBinaryAdapter hb = new HexBinaryAdapter(); 
      SecCrypto sc = new SecCrypto(); 

      byte abyte0[] = sc.decryptToBinary(encryptedKey); 
      System.out.println("New Secret Base64 Encoded : " + new String(Base64Coder.encode(abyte0))); 
      System.out.println("New Secret Hex Encoded : " + hb.marshal(abyte0)); 
      return; 
     } 
     catch(Exception ex) 
     { 
      System.out.println("Error:" + ex.getMessage()); 
     } 
    } 
} 

然后使用下面的.NET代码calcualte哈希

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace HsbcIntergration 
{ 
    internal static class CpiHashing 
    { 
     <USE THE VALUE RETURNED FROM THE JAVA CODE HERE> 
     private static readonly byte[] _secret = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 

     public static string ComputeHash(List<string> inputList) 
     { 
      return ComputeHash(inputList, _secret); 
     } 

     public static string ComputeHash(List<string> inputList, byte[] secretData) 
     { 
      List<string> orderedDataToHash = new List<string>(inputList); 
      orderedDataToHash.Sort(StringComparer.Ordinal); 

      StringBuilder sb = new StringBuilder(); 
      foreach (string s in orderedDataToHash) 
       sb.Append(s); 

      List<byte> dataToHash = new List<byte>(); 
      dataToHash.AddRange(Encoding.ASCII.GetBytes(sb.ToString())); 
      dataToHash.AddRange(secretData); 

      System.Security.Cryptography.HMAC sha = System.Security.Cryptography.HMACSHA1.Create(); 
      sha.Key = secretData; 
      return Convert.ToBase64String(sha.ComputeHash(dataToHash.ToArray(), 0, dataToHash.Count)); 
     } 
    } 
} 
5

如果您要注册的32位COM DLL使用VC++或Visual Basic 6.0创建,那么您必须按照以下步骤进行操作,而不对代码进行任何更改。它也不需要进行任何编译,也不需要在WOW模式下运行IIS。几年前我遇到过这个问题,我解决了这个问题,它对我来说工作正常。

场景:

让我假设你有一个供应商提供的第三方32位COM DLL。该DLL在32位操作系统上正常工作,并且即使您尝试通过regsv32注册,它仍然无法正常工作。

另外让我假设该DLL的名称是“ASXUpload.DLL”。我将在下面提供的解决方案中使用该名称。

解决方案

请按照下列步骤操作:

  1. 首先,如果你已经注册的DLL在64位操作系统的注销DLL。要做到这一点,只需在运行命令“regsvr32/u”,如“regsvr32/u C:\ MyDLL \ ASXUpload.DLL”中键入以下内容即可。如果您已经从x64操作系统注销了DLL,则无需运行此步骤。

  2. 此外请确保您没有将DLL保存在通常为C:\ Windows的Windows文件夹中。对于这个例子,我将DLL保存在以下文件夹C:\ MyDLL中。

  3. 现在我们需要使用Microsoft的组件服务添加COM +组件。要启动组件服务,请转到控制面板/管理工具/组件服务。进入组件服务之后,深入到计算机,然后深入我的电脑,然后深入COM +应用程序。然后右键单击COM +应用程序并选择“新建” - >“应用程序”。

  4. 在“欢迎使用COM应用程序安装向导”屏幕上,单击“下一步>”。

  5. 点击“创建空应用程序”按钮。

  6. 输入名称。由于我的DLL名称是ASXUpload.dll,所以我输入名称为“ASXUpload”。当被问及“库或服务器”时,选择“服务器”。

  7. 点击“下一步>”按钮,然后选择“此用户”。

  8. 输入用户或单击浏览以选择用户。单击浏览更安全,以确保使用正确的域名和拼写。输入密码并确认密码。警告,如果需要,请务必包含域名/用户名。点击“完成”。 (注意:我们推荐“此用户”,否则,必须有人登录到服务器才能运行DLL)。在我的情况下,我选择了域管理员帐户。您还可以添加一个服务帐户。如果您不确定,请咨询您的系统管理员。

  9. 现在会出现“添加应用程序角色”屏幕。不要添加任何东西只需点击“下一步>”按钮。

  10. 现在出现“添加用户到角色”屏幕。不要添加任何东西只需点击“下一步>”按钮。

  11. 现在您将看到,在组件服务 - >计算机 - >我的电脑 - > COM +应用程序 - >您将看到新添加的应用程序。在这个例子中,应用程序名称是“ASXUpload”。现在通过点击“+”图标钻取新添加的应用程序“ASXUpload”,您将看到“组件”。

  12. 现在右键单击“Components”,然后选择“New Component”。在“欢迎使用COM应用程序安装向导”屏幕上,单击“下一步>”。

  13. 点击“安装新组件”,现在选择你想注册的DLL。如果是“C:\ MyDLL \ ASXUpload.DLL”。

  14. 一旦你选择了DLL,你会看到它会显示你找到的组件。点击“下一步>”按钮继续,最后点击“完成”按钮完成。

  15. 现在是棘手的部分。右键单击您添加的应用程序,您将在组件服务 - >计算机 - >我的电脑 - > COM +应用程序下找到它。在我的情况下,应用程序名称是“ASXUpload”。右键单击应用程序后,选择“属性”。应用程序属性窗口将打开。点击“安全”标签。在安全选项卡中,确保在“授权”部分下的复选框“强制对此应用程序进行访问检查”未选中。

在“安全级别”部分下,选择单选按钮“仅在进程级别执行访问检查。安全属性不会包含在对象上下文中。 COM +安全呼叫上下文将不可用。“

确保未选中”应用限制策略“选项。

设置“模拟级别”为“无名氏”

如果您要访问的Web应用程序的DLL然后确保你添加IUSR和IWAM账号
  • 。为此,请转至COM +应用程序 - >应用程序名称(在这种情况下,它将为ASXUpload) - >角色 - > CreateOwner - >用户。右键单击用户并添加Internet信息服务器使用的IUSR和IWAM帐户。

  • 还在保留该DLL的文件夹上设置NTFS权限。在这种情况下,我将该DLL保存在文件夹C:\ MyDLL中。现在右键单击文件夹“MyDLL”并转到安全选项卡,然后添加IUSR和IWAM帐户。

  • 这就是你需要做的,你应该能够使用DLL。

    我在过去曾在生产环境中工作过的两个不同组织中使用了这种技术两次,并且它没有任何问题。首先我在2005年尝试了这一点,然后在2008年再次使用它。

    让我知道你是否面临任何问题。

    相关问题