什么是错误的,我与COM代码?(what's wrong in my code relate

2019-07-30 14:50发布

  *****BLOCK_1****

    if( strcmpi(appName.c_str(),MSSQL)==0 ||strcmpi(appName.c_str(),MSSQL2005)==0 )
{


      if (FAILED(CoCreateInstance (CLSID_SQLDMOServer, NULL, CLSCTX_INPROC_SERVER,
    IID_ISQLDMOServer, (LPVOID*)&m_pSQLServer))) {


    DMOAvailable=false;
    IDiscoverPtr pICalc;
    HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL,  CLSCTX_INPROC_SERVER,Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc));

    if(FAILED(hRes))

         {
           cout << "CoCreateInstance Failed on CLSID_SQLDMOServer\n";

       return FALSE;
     }

***BLOCK_2***

if((strcmpi(appName.c_str(),MSSQL2008)==0 || strcmpi(appName.c_str(),MSSQL2005)==0 )    && DMOAvailable==false )
{

    HRESULT hr=CoInitialize(NULL);
    IDiscoverPtr pICalc(__uuidof(SqlClass));
    if(FAILED(CoCreateInstance(Test::CLSID_SqlClass, NULL, CLSCTX_INPROC_SERVER, 
        Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc))))
    {
        cout<<" Loading SQLSMO failed This is because of SMO not Available "<<endl;
        return FALSE;
    }

}

*****BLOCK_3 ****

if((strcmpi(appName.c_str(),MSSQL2008)==0 && DMOAvailable==true))
{

    HRESULT hr= CoInitialize(NULL);

    cout<<"\nIn Init SqlServer DMO-true and SQL2008"<<endl;



    HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, CLSCTX_INPROC_SERVER, 
    Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc));
    if(FAILED(hRes))
    {
       printf(" Loading SQLSMO failed This is because of SMO not Available 0x%X\n",hRes)
       return FALSE;
    }
    else
        cout<<success;


}

return TRUE;
}


 I have prepared the Test.dll in c# and in that i have a an interface IDiscover and a     class SqlClass implementing that interface.I have Manually assigned the Guid like this

[System.Runtime.InteropServices.Guid("D4660088-308E-49fb-AB1A-77224F3FF851")]

public interface IDiscover
{
  string getSqlInstances(string HostName);

  string getDB(string SQLInstanceName);

  string getDatabaseInfo(string SQLInstanceName, string DBName);
};

namespace Test

  {

    [System.Runtime.InteropServices.Guid("46A951AC-C2D9-48e0-97BE-91F3C9E7B065")]

    public class SqlClass:IDiscover

  {

  }
}

我也做标记有ComVisible特性= TRUE;

并注册使用RegAsm.exe Test.dll的类/ TLB:Test.tlb /基本代码

和进口的TLB在一个CPP文件#进口C:\ Test.tlb named_guids

这是工作在我的机器罚款并以我的虚拟机的任何case.if我给SQL2005它工作,我给SQL2008它的工作。 而在一些其他机器它表明errror代码0x80004002进入第3,只有当block.if进入第1块和2块及其工作在其他机器精细also.what在第三块发生我不理解plzzzzzzzz帮我在这方面...

锐齿ü可以plzz经过这一个.....

Answer 1:

当使用COM工作,你的组件应该是“发布版本”。 确保周围的任何进一步挖掘之前的情况。



Answer 2:

这两种说法:

IDiscoverPtr pICalc(__uuidof(SqlClass));

HRESULT hRes=CoCreateInstance(Test::CLSID_SqlClass, NULL, CLSCTX_INPROC_SERVER, Test::IID_IDiscover, reinterpret_cast<void**> (&pICalc));

究竟做同样的事情,所以你不必按顺序运行它们。

第一个平移HRESULT成型_com_error的异常。 我想尝试这样的:

  IDiscoverPtr pDiscover;
  HRESULT hr = pDiscover.CreateInstance(__uuidof(SqlClass));
  if (FAILED(hr))
  {
    printf("SQL DMO is not avilable. Error code: 0x%X\n", hr);
  }

你能回来后的错误代码是什么?



Answer 3:

该IDiscoverPtr构造函数将抛出一个异常,如果它不能实例化COM对象。 最有可能的原因是,COM对象未在该机器的注册表中注册(regasm没有为实现该IDiscover .NET程序集运行)。



Answer 4:

我所看到的错误0x80004002 E_NOINTERFACE如果你试图调用的CreateInstance()在COM可见的类型暴露DateTime类型的属性。 我也注意到,你必须重建进口替代,如果例如TLB文件更改一个Build的TLB文件的项目。



文章来源: what's wrong in my code related to COM?