0

I have a vb6 COM dll with a class LoginClass and a function LoginUser in it. I need to dynamically call this vb6 COM dll from C#. I am trying below C# code to access it dynamically but the GetProcAddress is returning 0 even after a pointer returned by LoadLibrary.

static class NativeMethods
{
    [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

    [DllImport("kernel32")]
    public static extern bool FreeLibrary(IntPtr hModule);
}
class COMCommands
{    
 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
 private delegate string Login(string userName, string Password, bool Result);

 public string CallLoginCommand(string UserName, string Password, ref bool Result)
 {
  IntPtr pDll = NativeMethods.LoadLibrary(@"D:\MyCOMdll.dll");

  IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "LoginUser");

  Login CallLogin = (Login)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(Login));

  string theResult = CallLogin(UserName, Password, Result);

  bool result = NativeMethods.FreeLibrary(pDll);
  return theResult;
 }
}
4

1 回答 1

2

每当您尝试调用 DLL 中的函数时,首先在 DLL 上运行 dumpbin.exe /exports。从 Visual Studio 命令提示符执行此操作。它向您显示 DLL 导出的函数的名称。

在这种情况下,您可能只会看到 4 个导出的函数,即任何兼容自动化的 COM 服务器导出的函数。DllGetClassObject、DllRegisterServer、DllUnregisterServer 和 DllCanUnloadNow。而且您不会看到 LoginUser。DllUn/RegisterServer 由 Regsvr32.exe 调用,仅用于从注册表中注册和删除服务器。DllCanUnloadNow 是 Windows 调用的一个函数,用于检查是否可以从内存中卸载 DLL。DllGetClassObject 是大狗,它是一个类工厂函数并创建对象。使用任何 COM 服务器的必要起点是首先创建一个对象。然后您可以调用该对象上的方法,其中之一无疑被命名为 LoginUser。

要在 VB.NET 代码中使用这样的 COM 服务器,请从 Project + Add Reference 开始。单击浏览选项卡或按钮并导航到 DLL。Visual Studio 将读取嵌入在 DLL 中的类型库,它包含服务器实现的对象和接口的声明。假设 VB6 dll 名为“foo.dll”,您将在构建目录中获得一个 Interop.Foo.dll 文件。它与您的程序以及 COM 服务器的安装程序一起提供,因此它也可以在您的用户计算机上运行。

如果您不知道这些对象的外观,请单击“解决方案资源管理器”窗口中的“显示所有文件”图标,打开“引用”节点,右键单击您的 COM 服务器并选择“在对象浏览器中显示”。IntelliSense 将进一步帮助您跌入成功的陷阱。

于 2013-07-01T10:09:15.980 回答