Monthly Archives: October 2010

NoteExpress v2.6.1.1482多用户BUG

系统情况如下:

  • 操作系统Windows 7 中文
  • Office 2007 英文版
  • Kaspersky 2011 中文

全部正版。日常使用的是普通帐号(非管理员帐号)。下载了NoteExpress v2.6.1.1482后,安装时,提示需要管理员权限,提升到管理员帐号成功安装。

症状:

安装完成,不离开NE安装界面直接启动NE,成功(这时其实NE仍运行在管理员帐号下,因为安装已经提升到管理员帐号)。关闭安装界面,使用普通帐号打开NE,失败,提示该帐号下的Roaming目录下的NE配置文件失败。使用“以管理员权限运行”NE,成功。

以普通帐号打开Word,没有发现NoteExpress。以管理员权限打开Word,NE出现在Word界面上,正常运行。

以普通帐号打开Word,在Word选项里进入COM加载管理,没有发现NE项,通过Add… 将NE安装目录下的NEWordAddin2.dll 添到里面。关闭异常。再次打开Word,发现NE COM为inactive,无法正常添加。需要指出,如果运气太好,这时NE COM addin 添加成功了,那么每次打开word 都出现异常。这时请运行regedit,将HKEY_CURRENT_USERSoftwareMicrosoftOfficeWordAddinsNEWordAddin2.WordAddIn2删除,便可以正常启动Word。

原因:

NE在安装时,由于权限提升而导致用户帐号变化,错误地将一些必要配置文件写到管理员帐户下。

解决方案:

1. 每次运行NE,以管理员权限打开。相应的,也需要以管理员权限打开Word。不幸的是,由于权限控制,管理员帐户和当前普通帐号有不同的个人目录,比如这时NE打开的“我的目录”是管理员帐户的“我的文档”,而不是当前普通帐号的“我的文档”,再比如,无法将自己的桌面(当前普通帐号)上的文件拖到NE(运行在管理员权限下)附件里,诸如此类,很多不便。

2. 进到 C:Users<管理员帐号>AppDataRoaming 下,将其下的NoteExpress2目录里的全部目录和文件拷贝到当前普通帐号的对应位置,即C:Users<当前普通帐号>AppDataRoaming 下。在Word里打开Word选项,在COM加载项里添加NE安装目录下的NEWordAddin2.dll 。这样,普通帐号便可以正常运行NE了。

如果在COM加载项里原先已经有不打勾的NE,先将之移掉,重启Word,再行添加。

方案2无法回避的问题是,当NE有新版本出来,再行安装后,NE又将新的配置文件安装到管理员帐户下,无法对当前普通帐户进行自动更新,需要手工将Roaming下的对应NoteExpress 目录拷贝到当前帐户对应位置下。这个问题的解决,需要NE开发人员的修正。

然而,我前面在NE技术论坛上指出多用户下的这种BUG,有管理人员回复说,技术人员会进行测试,但我不认为NE技术人员意识到这种问题,并认真测试了。

要重放以上问题,准备2个干净的帐户(干净是指此前没有安装过NE),一是普通帐户,一是管理员帐户,使用干净普通帐户进行安装,安装时提升到干净的管理员帐户,应当可以reproduce描述的症状。

3. NE开发人员,在帐户提升的情况下,配置文件的安装应当是在当前普通帐户下,而不是提升后的管理员帐户下。

匆忙记录,错误在乎难免,请指正。

此BUG已经报告给NE相关人员,并在2.6.1.1508以后版本中得以修正。

愚弄小学生的东西

在数个群里都有人转发类似下面的文字:

“2010年的10月份是个不寻常的月份,这个月份中有5个星期五,5个星期六,5个星期日,这种情况需要823年后才能再次出现,这种月份被认为是钱币之月。”

小学毕业大致都可以猜出来月内5个周五周六周日的情况不致于这么罕见。简单计算一下,下一个这样的月份是,2011 年 7月,2013年3月,2014年8月,2015年的5月,,再下是2016年1月,2016年的7月。。。

呵呵!

在C中调用Fortran中的字符串数组

modparm.f

!在此模块下定义了很多共用变量,此处以title为例,定义为60个数组,每数组包括4字符

      module parm
      character(len=4) :: title(60), cpnm(5000)
      end module parm

getallo.f

!此函数(子例程)将使用modparm.f中定义的title变量,将从file.cio文件中读取3行填充title

      subroutine getallo
      use parm

!!    initialize variables
!      write(*,*) title
      title = “”

      open (23,file=”file.cio”)
      read (23,6000) titldum
      read (23,6000) titldum
      read (23,5100) title
      read (23,6000) titldum
      read (23,5000) figfile
      read (23,*) myr

      close (23)
      return
5000 format (6a)
5100 format (20a4)
6000 format (a80)
       end

将两fortran文件使用gfortran联编成 dll ,此时,title的实际符号为 __parm_MOD_title,getallo的实际符号为 getallo_。

在Qt/C++代码中读取和修改 title 变量,两个方法,如下:

1. 直接申明外部变量

#include <QtCore/QCoreApplication>
#include <QDebug>

extern “C” char __parm_MOD_title[60][4];
extern “C” void getallo_();

int main1(int argc, char *argv[])
{

     getallo_();
    char* aa = new char[60*4 +1];

    memcpy(aa, __parm_MOD_title, 60*4);
    aa[240]=”;

    qDebug()<<“__parm_MOD_title:”<<
            aa;
}

同样可以通过数组访问的方式对元素进行修改。

2. 通过动态加载resolve方法

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QLibrary>

extern “C” void getallo_();

int main(int argc, char *argv[])
{
    char * title =(char *)QLibrary::resolve(“../bin/test.dll”,”__parm_MOD_title”);

     getallo_();
    char* aa = new char[60*4 +1];
aa[240]=”;

    memcpy(aa, title, 60*4);

    qDebug()<<“__parm_MOD_title:”<<
            aa;

//修改第一个字符
title[0]=’h’;
   memcpy(aa, title, 60*4);
   qDebug()<<“__parm_MOD_title:”<<
           aa;
}

第二种方法将多维数组作为一维数组进行访问。

今天去了世博园

各个馆还是很漂亮,只是人多。昨天本想创新高(9.23达63万之多)结果才25万,今天刚才看了一下统计,已经有38万。多数排队都很长,只是从馆前看看,照个照片就过来了。只是看了几个小馆,排队在半小时以内。真要认真看,估计需要一周,内容还是很丰富。一个感受是中国馆真是很气派,占了偌大的地盘;美国馆英国馆等头号资本国家相对比就寒碜多了。罗马尼亚馆说为了公平,不设绿色通道,有点讽刺哦。园内喝了可乐,吃了吉野家,价格都可以接受,没有传说中的很贵。插队推挤到处可见。罕见的老外们还是高人一等。志愿者跟人讲话,都是不看人,感觉没有礼貌,不过是通病了。

世博参观人数达7000万按官方数据应该没有问题,只是很好奇,里面有多少是外国人,不知道官方能否给出个各国参观人数的统计。否则所谓刺激经济也是将全国人的钱转到上海钱袋里。至少今天匆忙转了A、B、C、E区,个人感觉99.9%是国人。

回到宾馆,感觉腰酸腿痛。