VS2005出现编译错误: fatal error C1902: Program database manager mismatch; please check your installation
复制3个文件(mspdb80.dll, mspdbsrv.exe and mspdbcore.dll), 从C:Program FilesMicrosoft Visual Studio 8Common7IDE 到 C:Program FilesMicrosoft Visual Studio 8VCbin
即可.其中mspdb80.dll可能会已经存在,无所谓了.
用VMWARE建了2台WINDOWS2003,各装了SQL2005来试验LINKED SERVER,结果在2号机上建1号机的LINKED SERVER时总是报错说"服务器已存在",在2号机上运行查询,
exec sp_helpserver
结果中出现1号机,可能是以前自己练习时加入的,不知为何在SSMS中看不到但是在系统中却存在着.继续运行如下脚本将其删除.
exec sp_droplinkedsrvlogin 'TEST2003',null
exec sp_dropserver 'TEST2003'
注意TEST2003要大写,否则会出错.再exec sp_helpserver查看,系统报告"没有定义服务器".
-
C++使用 void extern __declspec(dllexport) 函数名()定义的输出函数, 在C#中调用时, 如前文所述, 使用
[DllImport("D:\VS2005Projects\Dev_PetroSim2010b\Dev_AMDBR\Debug\Dev_DR_AMDBR.dll", EntryPoint = "#1")]
public static extern void amDBRSurfaceTensionEX(int compCount, int[] components, int modelID, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] double[] Z, ref int errorID);
来调用.
这里注意的是,定义函数入口点的参数EntryPoint = "#1", C#中有2种方式可以定义入口点, 一种是以序号加前缀"#",这是我一直用的,另一种是用EntryPoint="函数名",这种方法我试了很多次却无法实现,C#编译器总会说在DLL中没有找到函数.
如何找到函数所对应的EntryPoint编号呢?我用的是一个叫DLLExportViewer的软件,可以告诉你各个函数的Ordinal,即编号,照此调用即可,但是问题是,如果原DLL进行编辑之后,增加或减少输出函数之后,各个函数的编号会重新打乱,使原程序无法进行.所以对这种情况,即DLL尚在编辑之中时,还是以函数名作为EntryPoint比较好.
在C:Program FilesMicrosoft Visual Studio 8VCbin目录中,有一个文件dumpbin.exe文件和DLLExportViewer一样可以查看DLL的输出函数,但是在运行时,居然跳出一个错误窗口
查找后发现,mspdb80.dll文件是在C:Program FilesCommon FilesMicrosoft SharedVSA8.0VsaEnv中,将此文件复制到C:Program FilesMicrosoft Visual Studio 8VCbin目录,再运行时错误消失.
查阅dumpbin的输出,发现输出函数说明及如下
| ordinal | hint | RVA | name |
| 7 | 6 | 0002D591 | ?amDBRSurfaceTensionEX@@YAXHPAHHPANAAH@Z = @ILT+1420(?amDBRSurfaceTensionEX@@YAXHPAHHPANAAH@Z) |
前面的ordinal 7即为函数的输出序号, name列即为可用的函数名,在C#中,改函数声明为如下即可用函数名作为EntryPoint
[DllImport("D:VS2005ProjectsDev_PetroSim2010bDev_AMDBRDebugDev_DR_AMDBR.dll", EntryPoint = "?amDBRSurfaceTensionEX@@YAXHPAHHPANAAH@Z")]
============================================
照上述做法,导出函数可以成功,但是在C#中调用却是相当麻烦,因为函数的入口名称太过繁杂且不可理解,因此,还是要解决在C++中的函数输出,以使在C#中能直接以函数名作为入口.
上述问题中,实际上是在C++中函数输出时,默认输出名是使用C++的mangled name, 要使用C的命名方式方可直接使用其输出名,这时,函数输出声明应改为如下:
extern "C" __declspec(dllexport) void amDBREnthalpyEX(int CompCount, int* streamComp, int modelID, double* streamInfo, int& errorID)
这样,可以看到DLLExportViewer的查看结果了,以此方式声明的amDBREnthalpyEX函数和以原方式声明的其他函数的名称的不同如下图所示.
这时,在C#中,就可以以函数名称作为入口点了:
[DllImport("D:VS2005ProjectsDev_PetroSim2010bDev_AMDBRDebugDev_DR_AMDBR.dll", EntryPoint = "amDBREnthalpyEX")]
public static extern void amDBREnthalpyEX(int compCount, int[] components, int modelID, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] double[] Z, ref int errorID);
最近一直有个烦人的困扰,就是划词自动复制的问题,这事说大不大,说小不小.在编辑文本时,要移动对象A用于取代B,我的操作通常是先把用鼠标拖动选中A并CUT了,然后再拖动选中B再直接PASTE,但是最近发现拖动选中B之后,剪贴板中的内容自动变成B了,原来复制的A居然自动消失了,而且奇怪的是有时候是这样,有时候就不是,让我郁闷了很久.
今天才发现,原来是LINGOES词典的划词翻译搞的鬼!
用LINGOES进行划词翻译或者双击翻译时,它居然是先把词选中然后复制到剪贴板再进行的翻译.呜呼~~太可恨了,原来看LINGOES占用资源少,就想用LINGOES来取代金山词霸,看来又要换回去了...
换回了金山词霸GOOGLE合作版,发现内存占用比LINGOES多了10多M,还好可以接受,不过问题是双屏显示时,而且副屏是在主屏的左侧时,对副屏取词,词霸的弹出窗口却显示在主屏上,查看不方便,但是当副屏在主屏的右侧时就没有这个问题.不过这点不便总比LONGOES擅自篡改剪贴板的好得多.
材料: 豬肉,東菇,木耳,芛,豆付,雞蛋,醋,白胡椒粉,辣椒醬,雞湯,水,鹽,老抽(做色),麻油,生粉
豬肉用鹽, 糖, 生抽, 豆粉,紹酒, 麻油,胡椒粉醃好,東菇,木耳,芛,豆付切絲備用. 雞蛋打好.生粉用水攪開.
冷水放雞湯,東菇,木耳,芛煮滾,下醋,白胡椒粉,辣椒醬,鹽,老抽調味,然后放生粉水,最后下豬肉,豆付再試味,湯做好了就下蛋水和麻油即成.
如果用6quart雞湯,下1/3杯白醋,試味,如果不夠酸,慢慢加鹽和醋調味.





