簡體   English   中英

與COM相關的代碼有什么問題?

[英]what's wrong in my code related to COM?

  *****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 / codebase注冊該類

並在一個cpp文件中將tlb導入為#import c:... \\ Test.tlb named_guids

在任何情況下,這在我的機器上以及我的虛擬機中都可以正常工作。如果我給sql2005可以工作,而我給sql2008可以工作。 在另一台機器上,它僅在進入第三塊時才顯示錯誤代碼為0x80004002。如果它進入第一塊和第二塊也可以在其他機器上正常工作。在第三塊中發生了什么我不理解plzzzzzzzz在這方面對我有幫助...

銳齒你可以通過這個.....

使用COM時,程序集應為“發布版本”。 在深入研究之前,請確保是這種情況。

如果IDiscoverPtr構造函數無法實例化COM對象,則將引發異常。 最可能的原因是該COM對象未在該計算機的注冊表中注冊(未對實現IDiscover的.NET程序集運行重排)。

這兩個語句:

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);
  }

您能發回錯誤代碼是什么嗎?

如果您在嘗試調用CreateInstance()的com可見類型上公開DateTime類型的屬性,我已經看到錯誤0x80004002 E_NOINTERFACE。 我還注意到,例如,如果tlb文件發生更改,則必須重建導入tlb文件而不是Build的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM