*****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/кодовая
и импортирован TLB в одном CPP файле как #import с: ... \ Test.tlb named_guids
Это прекрасно работает на моей машине, а также в моей виртуальной машине для любого случая. Если я дал sql2005, он работает, и я дал sql2008, он работает. и в какой-то другой машине он показывает, что код ошибки как 0x80004002 только при входе в 3-й блок. Если он входит в 1-й блок и 2-й блок, его рабочий тон в другой машине тоже. Что происходит в 3-м блоке, я не понимаю, что plzzzzzzzz помогает мне в этом что касается ...
Sharptooth и может PLZZ пройти через этот .....
Вызывает ли это исключение? Или какой-то COM-вызов сообщает о сбое? – EFraim
, когда я отлаживаю приложение в тот момент, когда отладчик указал на __uuid (sqlclass), он открывает визуальное окно C++ debugge и показывает, что необработанное исключение происходит в ячейке памяти XXXXXXXXX - Cute – Cute