*****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
并将tlb导入一个cpp文件中作为#import c:... \ Test.tlb named_guids
这在我的机器和我的虚拟机中工作正常任何情况。如果我给sql2005它工作,我给sql2008它工作。 并且在其他一些机器中它显示errror代码仅在进入第3块时为0x80004002。如果它进入第1块和第2块也在其他机器中正常工作。第3块发生了什么我不理解plzzzzzzzz在这方面帮助我...
Sharptooth你可以通过这个...... [/ p>
答案 0 :(得分:1)
使用COM时,程序集应为“Release Builds”。在进一步挖掘之前确保是这种情况。
答案 1 :(得分:0)
如果IDiscoverPtr构造函数无法实例化COM对象,则会引发异常。最可能的原因是COM对象未在该计算机的注册表中注册(regasm未针对实现IDiscover的.NET程序集运行)。
答案 2 :(得分:0)
这两个陈述:
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);
}
你能回发一下错误代码是什么吗?
答案 3 :(得分:0)
如果您在尝试调用CreateInstance()的com可见类型上公开DateTime类型的属性,我已经看到错误0x80004002 E_NOINTERFACE。我还注意到,如果tlb文件发生变化,你必须重建导入tlb文件而不是Build的项目。