将dll导出的函数包成com组件的一个有关问题

将dll导出的函数包成com组件的一个问题!
大体思路是这样的,制作了一个类输出为dll,然后新建一个com工程调用这个dll将dll里的方法包装成com组件。
我具体是这样实现的:
1、新建一个dll工程,导出一个类的dll(新建了一个CMath 类,添加了Add方法)。
class AFX_EXT_CLASS CMath  
{
public:
int Add(int a,int b);
CMath();
virtual ~CMath();

};

int CMath::Add(int a, int b)
{
return a+b;
}
2、新建一个atl com工程,链接上cmath.lib,添加一个ICMath接口,其内新建一个Add方法,里面重新包dll中的Add方法。
STDMETHODIMP CCMath::Add(int a, int b, int *presult)
{
// TODO: Add your implementation code here
CMath ma;
*presult = ma.Add(a,b);
return S_OK;
}
利用*presult存储返回值

3、进行客户调用的测试,新建了一个MFC工程,在对话框上添加了一个按钮,其内代码如下:
void CClientTestDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
CoInitialize(NULL);
HRESULT hr;
int *a = NULL;
CComPtr<ICMath> ma;
hr = CoCreateInstance(CLSID_CMath,NULL,CLSCTX_INPROC_SERVER,IID_ICMath,(void**)&ma);
if(SUCCEEDED(hr))
{
ma->Add(1,2,a);
}
CString str;
str.Format("%d",*a);
MessageBox(str,NULL,MB_OK);
CoUninitialize();
}

我的问题是:这个测试程序在运行时出错,错误原因是hr的值为-2147024770,表示找不到指定的模块,也就是说hr = CoCreateInstance(CLSID_CMath,NULL,CLSCTX_INPROC_SERVER,IID_ICMath,(void**)&ma);这一步执行不正确没有找到组件,我的问题出在了哪里???????????????????

还请高手指点一二。。。

------解决方案--------------------
感觉这个问题不是没有注册的原因,atl的COM工程在生成的时候就自动注册了,楼主还是检查一下其他问题。个人感觉应该是dll文件和COM链接有问题