*****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にします。COMに関連する私のコードで何が間違っていますか?
とRegAsm.exeをTest.dllの/ TLBを使用してクラスを登録します。Test.tlb /コードベース
との#import Cのような1つのcppファイルにTLBをインポート:... \ Test.tlb named_guids
これは私のマシンでも問題なく動作しています。そして、私の仮想マシンでも、どのケースでも動作しています。私はsql2005にそれを与え、私はsql2008を動作させました。 とそれ以外のマシンでは、3番目のブロックに入ると0x80004002というエラーコードが表示されます.1番目のブロックに入り、2番目のブロックは他のマシンでも正常に動作します.3番目のブロックで何が起こっているのですか? ...それはCOMオブジェクトをインスタンス化できない場合IDiscoverPtrコンストラクタが例外をスローします
例外がスローされますか?または、いくつかのCOMコールが失敗を報告しますか? – EFraim
デバッガが__uuid(sqlclass)をポイントした時点でVisual C++デバッグウィンドウが開き、メモリ位置XXXXXXXXXで未処理の例外が発生した瞬間にアプリケーションをデバッグすると - – Cute