Jacob com.jacob.com.ComFailException: Can't map name to dispid:

Uncle Boni picture Uncle Boni · Nov 14, 2014 · Viewed 7.7k times · Source

I've been trying to call a dll function from Java using Jacob without any success. I have done registration of the dll with regasm as described here - http://www.dreamincode.net/forums/topic/114094-using-dll-library-in-java-application-using-jacob/. My code:

String serverName = "...", fileName = "...";
Dispatch dispatch = new Dispatch("dllx32conn.dbconn");  
Dispatch.call(dispatch, "pass_para", serverName, fileName);

This doesn't work. It throws com.jacob.com.ComFailException: Can't map name to dispid: pass_para

So I decided to analyze the dll functions by decompiling it using JetBrains dotPeek. Here is what I found

using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;

namespace dllx32conn
{
  public class dbconn
  {
    public static string conn_str = "";
    public static string strFilePath = "";
    public static SqlConnection Conn = new SqlConnection();
    public static DataTable tbl;
    public static SqlDataAdapter dap;

    public static void pass_para(string servname, string csvpth)
    {
      dbconn.conn_str = "Data Source=" + servname + ";Initial Catalog=Billing;User Id=Scd;Password=Smart11Siri";
      dbconn.strFilePath = csvpth;
    }
  }
}

I would really appreciate some help with figuring out what's not happening here. Thanks.

Answer

Uncle Boni picture Uncle Boni · Nov 14, 2014

Problem solved - I just had to remove the 'static' function declaration from my DLL methods thanks to this article - http://jumbloid.blogspot.com/2009/12/making-net-dll-com-visible.html

using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;

namespace dllx32conn
{
  public class dbconn
  {
    public static string conn_str = "";
    public static string strFilePath = "";
    public static SqlConnection Conn = new SqlConnection();
    public static DataTable tbl;
    public static SqlDataAdapter dap;

    public void pass_para(string servname, string csvpth)
    {
      dbconn.conn_str = "Data Source=" + servname + ";Initial Catalog=xxx;User Id=xxx;Password=xxx";
      dbconn.strFilePath = csvpth;
    }
  }
}