*****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
{
}
}
Ich mache auch COMVisible = wahr;Was ist falsch in meinem Code in Bezug auf COM?
und registrieren die Klasse mit RegAsm.exe Test.dll/tlb: Test.tlb/Code-Basis
und importiert den TLB in einer CPP-Datei als Import c: ... \ Test.tlb named_guids
Das funktioniert gut in meiner Maschine und auch in meiner virtuellen Maschine für jeden Fall. Wenn ich sql2005 gab es funktioniert und ich gab sql2008 es funktioniert. und in einer anderen Maschine zeigt es, dass Fehlercode wie 0x80004002 nur beim Eintritt in den dritten Block.Wenn es in den ersten Block und 2. Block geht es funktioniert auch in anderen Maschinen gut. Was passiert im dritten Block ich verstehe nicht plzzzzzzzz mir dabei helfen regard ...
Sharptooth u gehen durch diese eine plzz kann .....
Wird eine Ausnahme ausgelöst? Oder einige COM-Anrufberichte Fehler? – EFraim
Wenn ich die Anwendung den Moment debugging, als der Debugger auf __uuid (sqlclass) zeigte, öffnet es ein visuelles C++ - Debuggerfenster und zeigt eine nicht behandelte Ausnahme am Speicherort XXXXXXXXX - Cute – Cute