您的位置:首页 > 其它

如何在wince下注册COM组件?

2009-11-11 19:48 549 查看
使用VS2005写了一个COM,在Wince下使用,给其他程序调用,所以我们需要先注册好。

注册有两种方式:

1 写好COM组建后,部署到目标平台,这样目标平台就可以使用了。

但是有一个问题,如果注册表项不可以保存的话,那不就麻烦了,所以最好的方法是比较下部署前后的差异,把比较后的不同的地方写在bib文件当中,这样在OS当中就有了,那不就可以用了?呵呵。



2 如果有些朋友的不能部署,那也可以通过软件的方法,自己来写,注册。代码如下。注意自己的东西需要稍加修改。不用说,你也知道修改那些地方。



//先反注册

LPCTSTR strFileName;

strFileName=TEXT("//Windows//my.dll"); //refer to your dll



typedef (WINAPI * UNREGISTER_FUNC) (void);

UNREGISTER_FUNC MyFunc=NULL;

HMODULE hModule=::LoadLibrary(strFileName);

if(hModule)

{

MyFunc=(UNREGISTER_FUNC)GetProcAddress(hModule,L"DllUnregisterServer");

if(MyFunc==NULL)

{

MessageBox(NULL,TEXT("can't find 'DllUnregisterServer' func!"),TEXT("Error"),MB_OK);

}

else

{

MyFunc();

MessageBox(NULL,TEXT("Unregister dll ok!"),TEXT("Error"),MB_OK);

}

::FreeLibrary(hModule);

}

//注册

typedef (WINAPI * REGISTER_FUNC) (void);

REGISTER_FUNC MyFunc2=NULL;

HMODULE hModule2=::LoadLibrary(strFileName);

if(hModule2)

{

MyFunc2=(REGISTER_FUNC)GetProcAddress(hModule2,L"DllRegisterServer");

if(MyFunc2==NULL)

{

MessageBox(NULL,L"can't find 'DllRegisterServer' func!",TEXT("Error"),MB_OK);

}

else

{

MyFunc2();

MessageBox(NULL,L"register dll ok!",TEXT("Ok"),MB_OK);

}

::FreeLibrary(hModule2);

}

//更新注册表

WCHAR wszKey1[]=L"{clsid}";

WCHAR wszName1[]=L"";

WCHAR wszValue1[]=L"mycomname";



WCHAR wszKey2[]=L"InprocServer32";

WCHAR wszName2[]=L"";

WCHAR wszValue2[]=L"//Windows//my.dll";

WCHAR wszName3[]=L"ThreadingModel";

WCHAR wszValue3[]=L"BOTH";





DWORD dwDisposition;

DWORD dwDataSize;

LPBYTE lpData;



long lRet;

long lErr;



HKEY hKey = HKEY_CLASSES_ROOT;

if (hKey)

{

lRet = RegOpenKeyEx(hKey, L"CLSID", 0, KEY_ALL_ACCESS, &hKey);



// create key --- clsid {clsid}

lErr = RegCreateKeyEx(hKey, wszKey1, 0, _T(""),

REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);

if (lErr == ERROR_SUCCESS)

{

// set value

lpData = new BYTE[ (wcslen(wszValue1)+1)*sizeof(WCHAR) ];

memset(lpData,0,(wcslen(wszValue1)+1)*sizeof(WCHAR) );

memcpy(lpData, (LPCTSTR)wszValue1, (wcslen(wszValue1)+1)*sizeof(WCHAR) );

dwDataSize=(wcslen(wszValue1))*sizeof(WCHAR);

lRet = RegSetValueEx(hKey, (LPCTSTR)wszName1, 0, REG_SZ, (LPBYTE)lpData, dwDataSize);

delete [] lpData;

}



// create key --- InprocServer32

lErr = RegCreateKeyEx(hKey, wszKey2, 0, _T(""),

REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);

if (lErr == ERROR_SUCCESS)

{

// set value

lpData = new BYTE[ (wcslen(wszValue2)+1)*sizeof(WCHAR) ];

memset(lpData,0,(wcslen(wszValue2)+1)*sizeof(WCHAR) );

memcpy(lpData, (LPCTSTR)wszValue2, (wcslen(wszValue2)+1)*sizeof(WCHAR) );

dwDataSize=(wcslen(wszValue2))*sizeof(WCHAR);

lRet = RegSetValueEx(hKey, (LPCTSTR)wszName2, 0, REG_SZ, (LPBYTE)lpData, dwDataSize);

delete [] lpData;





// set value

lpData = new BYTE[ (wcslen(wszValue3)+1)*sizeof(WCHAR) ];

memset(lpData,0,(wcslen(wszValue3)+1)*sizeof(WCHAR) );

memcpy(lpData, (LPCTSTR)wszValue3, (wcslen(wszValue3)+1)*sizeof(WCHAR) );

dwDataSize=(wcslen(wszValue3))*sizeof(WCHAR);

lRet = RegSetValueEx(hKey, (LPCTSTR)wszName3, 0, REG_SZ, (LPBYTE)lpData, dwDataSize);

delete [] lpData;

}



RegCloseKey(hKey);



}



代码是网上转来的,他是Windows系统,Wince系统需要注意位置修改下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: