我用windows2000, vc6sp6
以前写程序的时候,都是用静态连接的方式。这样的话,把产生的exe文件直接拷贝给其他人,直接就可以用了,虽然这样得到的exe文件有点大,但是方便。现在我遇到的问题是,我在程序里面使用了微软的串口通讯的控件mscomm,我用同样的方法产生的exe文件给其他人时候,如果其他的机器,装vc的话,可以运行;如果没有装vc的话,就运行不起来了,并且提示信息“Microsoft Visual C++ Runtime Library, Runtime Error, abnormal program termination”。 我猜想恐怕是其他人机器没有注册这个串口控件的原因。请问,如何在程序里面如何写代码注册这个控件?有没有更简单的方法,可以让我产生的exe可以在其他人机器上面直接运行?谢谢!
以前写程序的时候,都是用静态连接的方式。这样的话,把产生的exe文件直接拷贝给其他人,直接就可以用了,虽然这样得到的exe文件有点大,但是方便。现在我遇到的问题是,我在程序里面使用了微软的串口通讯的控件mscomm,我用同样的方法产生的exe文件给其他人时候,如果其他的机器,装vc的话,可以运行;如果没有装vc的话,就运行不起来了,并且提示信息“Microsoft Visual C++ Runtime Library, Runtime Error, abnormal program termination”。 我猜想恐怕是其他人机器没有注册这个串口控件的原因。请问,如何在程序里面如何写代码注册这个控件?有没有更简单的方法,可以让我产生的exe可以在其他人机器上面直接运行?谢谢!
bool RegMscomm()
{
//注册串口控件
HKEY hClsIDkey = NULL;//注册表键句柄
DWORD disposition;
DWORD datatype =REG_SZ;
bool bNeedReg = false;
char *szsubkey = "CLSID\\{648A5600-2C6E-101B-82B6-000000000014}\\InprocServer32";
if(::RegOpenKeyEx(HKEY_CLASSES_ROOT,szsubkey,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, &hClsIDkey) != ERROR_SUCCESS )
{
bNeedReg = true;
}
else
{
//::RegCreateKeyEx(HKEY_CLASSES_ROOT,szsubkey ,0, NULL, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL, &hClsIDkey, &disposition);
long ret ;
char pFile[255];
memset(pFile,0,255);
DWORD datalen = 255;
int retvalue = 0;
ret = ::RegQueryValueEx(hClsIDkey,"", NULL, &datatype, (unsigned char*)pFile, &datalen );
if(hClsIDkey)
::RegCloseKey( hClsIDkey);
CFileFind ff;
bNeedReg = (ret!=ERROR_SUCCESS || ! ff.FindFile(pFile));
ff.Close();
} if(bNeedReg)
{
HINSTANCE hLib = LoadLibrary(gpApp->g_myPublic.GetMyPath() +"\\mscomm32.ocx");//装载ActiveX控件
if (hLib < (HINSTANCE)HINSTANCE_ERROR) return false;
FARPROC lpDllEntryPoint;
lpDllEntryPoint = GetProcAddress(hLib,("DllRegisterServer"));//获取注册函数DllRegisterServer地址
if(lpDllEntryPoint==NULL)
{
FreeLibrary(hLib);
return false;
}
if(FAILED((*lpDllEntryPoint)()))
{
FreeLibrary(hLib);
return false;
}
FreeLibrary(hLib);
}
HKEY hkey = NULL;//注册表键句柄
if(::RegCreateKeyEx(HKEY_CLASSES_ROOT, "Licenses\\4250E830-6AC2-11cf-8ADB-00AA00C00905",0, NULL, REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL, &hkey, &disposition) == ERROR_SUCCESS)
{
char *pdata = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun";//[255];
datatype =REG_SZ;
::RegSetValueEx(hkey, "",0, datatype, (unsigned char*)pdata, strlen(pdata)+1 );
if(hkey)
::RegCloseKey( hkey);
}
return true;
}