我用windows2000, vc6sp6
以前写程序的时候,都是用静态连接的方式。这样的话,把产生的exe文件直接拷贝给其他人,直接就可以用了,虽然这样得到的exe文件有点大,但是方便。现在我遇到的问题是,我在程序里面使用了微软的串口通讯的控件mscomm,我用同样的方法产生的exe文件给其他人时候,如果其他的机器,装vc的话,可以运行;如果没有装vc的话,就运行不起来了,并且提示信息“Microsoft Visual C++ Runtime Library, Runtime Error, abnormal program termination”。 我猜想恐怕是其他人机器没有注册这个串口控件的原因。请问,如何在程序里面如何写代码注册这个控件?有没有更简单的方法,可以让我产生的exe可以在其他人机器上面直接运行?谢谢!

解决方案 »

  1.   

    把mscomm32.ocx也放在你的应用程序目录下,然后应用程序每次启动调用以下函数注册(路径自己修改)
    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;
    }