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);
原来插入这个YOUTUBE视频一直显示不出来,以前插入的是视频的网页链接http://www.youtube.com/watch?v=ZzcEru7bNes,所以不行,改成视频文件链接http://www.youtube.com/v/ZzcEru7bNes 以后就可以了.
帮老婆的弟媳做一个网站,下载了一份现成的PHP代码,不过都是加了密的.有些改动需要对PHP文件进行,可是发现这份东西是用了ZEND加密的,网上现成的DEZENDER的软件不少,绝大多数是基于黑刀改装的,效果不错,可是都不能对目录结构进行原样复制.找到一份梅花三弄版 DEZENDER据说可以保持原目录结构,可是不知是什么原因,居然在我的计算机上运行不起来.于是我就想自己写一个程序来做这事,顺便学习一下C#.
Form上的几个基本控件:
- txtFolder: PHP文件所在的根目录, 新目录将自动取名为目录名_new
- button1: txtFolder的browse按钮
- CheckBox1: With Subfolders 标记, 即操作是否包括各级子目录
- CheckBox2: Process PHP files only 标记, 即操作是否只针对PHP文件,如果要针对所有文件,则非PHP文件将被复制到指定目录
- txtLog: 日志框, 输出所有信息
- stsInfo: StatusBar, 显示一些提示信息
- btnList: 显示所有文件到txtLog
- btnbProcess: 对文件进行操作
几个private变量:
- private bool WithSub = true; //对应checkbox1
- private bool PhpOnly = false; //对应checkbox2
- private string RootDir; //对应txtFolder
检查运行环境, PHP.EXE是黑刀的执行文件, 必须在当前目录下存在.
- private void Form1_Load(object sender, EventArgs e)
- {
- if (!File.Exists(".php.exe"))
- {
- MessageBox.Show("No php.exe found, the program may not run properly!");
- Application.Exit();
- }
- dlgOpenFld.SelectedPath = "D:temp";
- }
另外, 在PHP.INI文件中, 要确认以下文件的路径名正确, 个人感觉用相对路径会好一些
- [Zend]
- zend_extension_manager.optimizer_ts="libOptimizer-3.3.0"
- zend_extension_ts="libZendExtensionManager.dll"
下面, BROWSE文件夹操作.
- private void button1_Click(object sender, EventArgs e)
- {
- if ( dlgOpenFld.ShowDialog() == DialogResult.OK )
- {
- txtFolder.Text = dlgOpenFld.SelectedPath;
- }
- }
最重要的操作之一, 用递归取得文件列表, 在这一步里,用到了List<>这样的数据类型, 这是用于未知长度数组的, 可以看到, C#对于文件,目录的操作都与DELPHI有了非常大的不同, 这就是FRAMEWORK:
- private List<FileInfo> getFiles(string tDir, bool SubFolder)
- {
- List<FileInfo> FileList = new List<FileInfo>();
- DirectoryInfo fDir = new DirectoryInfo(tDir);
- DirectoryInfo[] subDir = fDir.GetDirectories();
- FileInfo[] sFile = fDir.GetFiles();
- if (SubFolder)
- {
- foreach (DirectoryInfo d in subDir)
- {
- FileList.AddRange(getFiles(tDir + "" + d.Name, SubFolder));
- }
- }
- foreach (FileInfo f in sFile)
- {
- FileList.Add(f);
- }
- return FileList;
- }
下一步, 就是对取得的文件列表进行操作了,新文件夹自动取名为XXX_NEW, 并且对文件列表按规则进行操作, 即是只解密PHP文件, 还是要同时复制其他非PHP文件:
- private void button1_Click_1(object sender, EventArgs e)
- {
- if (!Directory.Exists(txtFolder.Text)||(txtFolder.Text.IndexOf(" ")>0))
- {
- MessageBox.Show("Directory "" + txtFolder.Text + "" is invalid! (No space allowed)", "Invalid folder selection", MessageBoxButtons.OK,MessageBoxIcon.Error);
- return;
- }
- RootDir = txtFolder.Text;
- string newDir=RootDir + "_new";
- List<FileInfo> FileList = new List<FileInfo>();
- FileList = getFiles(txtFolder.Text, WithSub);
- for (int i = 0; i < FileList.Count; i++)
- {
- string tNewDir = FileList[i].DirectoryName.Replace(RootDir, newDir);
- if (!Directory.Exists(tNewDir))
- {
- Directory.CreateDirectory(tNewDir);
- }
- if (FileList[i].Extension != ".php")//&&(FileList[i].
- {
- File.Copy(FileList[i].DirectoryName + "" + FileList[i].Name, tNewDir + "" + FileList[i].Name);
- txtLog.AppendText("COPIED! " + i.ToString() + " - " + FileList[i].DirectoryName + "" + FileList[i].Name + "nn");
- }
- else
- {
- if (runphp(FileList[i].DirectoryName + "" + FileList[i].Name, tNewDir))
- {
- txtLog.AppendText("DECRYPTED! " + i.ToString() + " - " + FileList[i].DirectoryName + "" + FileList[i].Name + "nn");
- }
- else
- {
- txtLog.AppendText("FAILED TO DECRYPT! " + i.ToString() + " - " + FileList[i].DirectoryName + "" + FileList[i].Name + "nn");
- }
- }
- }
- }
这是解码PHP文件, 通过建立新进程来调用外部EXE文件:
- private bool runphp(string filename, string NewFolder)
- {
- try
- {
- string EXE_PATH = @".";
- System.Diagnostics.Process process = new System.Diagnostics.Process();
- process.StartInfo.FileName = "php.exe";
- process.StartInfo.WorkingDirectory = EXE_PATH;
- process.StartInfo.CreateNoWindow = true;
- process.StartInfo.Arguments = filename + " /tab /indent:1 /path:" + NewFolder + " /ext:* /noexpire";
- process.Start();
- if (process.HasExited)
- {
- //txtLog.AppendText("finished!nn");
- //return true;
- }
- return true;
- }
- catch (Exception e)
- {
- throw e;
- //return false;
- }
- }
其他的代码就不一一罗列了. 只是临时使用的代码, 功能还非常简单.
联绵词:指两个音节连缀成义而不能拆开来讲的词。包括在单纯词中,它包含了双声的,如:“仿佛”、“伶俐”等,也有叠韵的。 连绵词有一下三种类型: 1、双声词。双声词指两个音节的声母相同的连绵词。 2、叠韵词。叠韵词指两个音节的韵母相同的连绵词。如“骆驼”“徘徊”。 3、非双声叠韵词。非双声叠韵词指既非双声又非叠韵的连绵词。 【植物类】蘑菇 蘼芜 芎藭 荼蘼(酴醾)蒺藜 蔓菁(芜菁)茉莉 芙蓉 芙蕖 芫荽 蒹葭 萑苇 唐棣 枇杷 葫芦 橄榄 葡萄 苜蓿 石榴 柠檬 菝葜 蔷薇 玫瑰 芍药 咖啡 薜荔 菥蓂 荸荠 芣苜 栝楼 枸橘 苤蓝(薜蓝、苴蓝)莙荙 葶苈 莱菔 莴苣 苣荬 刍荛 荜菝 芘芣 筼筜 莳萝 桫椤 萆薢 萝艻(萝) 菖蒲 芭蕉 茼蒿(蓬蒿)菠萝 蘡薁 蓇葖 茱萸 莪蒿 茯苓 莪术 苁蓉 菡萏 茖葱 茑萝 画眉 茺蔚 茳芏 蒲葵 薄荷 莨菪 葭莩 蘅芜 薏苡 薯蓣 蓁艽 鲯鳅 梧桐 珙桐 梐枑 桄榔 枸杞 枸橼 牡丹 豆蔻 蘼芜 芣苢 芙蕖 林檎 杜鹃 杜若 茹蕙 荃蕙 箟簬 【动物类】蝌蚪 蚂蚁 蟋蟀 鹦鹉 蜘蛛 蚣蝑 蠛蠓 蛈蜴 蝤蛴 蛴螬 蚰蜒 鸳鸯 鸲鹆 鶶鷵 騊駼 骆驼 貔貅 杜鹃 蜻蜓 蟑螂 蛤蟆 凤凰 蝾螈 蟏蛸 鮟鱇 狴犴 猰貐 梼杌 麒麟 骐骥 蟛蜞 蝴蝶 鹣鲽 蟋蝼 鸧鹒 螟蛉 蜗螺 蒲卢 狐狸 蝤蛴 蜥蜴 蛴螬 蝙蝠 螺蛳 螵蛸 饕餮 砗磲 蚍蜉 蜚蠊 蛤蜊 猞猁 猢狲 蝈蝈 螳螂 蜾蠃 蠼螋 蜈蚣 促织 蛐蟮 鹭鸶 赑屃 蚱蜢 蜉蝣 狻猊 玳瑁 犰狳 獬豸 珊瑚 鸑鷟 鹧鸪 鸺鹠 蟾蜍 鹪鹩(鸱鸲)鶗鴂 鸊鷈 鸂鶒 蜣螂 蝤蛑 蚯蚓 孑孓 熊猫 蚂蟥 鹌鹑 守宫 鼧鼬 骅骝 蛤蜊 蝍蛆 鹘鸼(鹘鸠) 魍魉 魑魅 傀儡 蚂蟥 猛犸 鹈鹕 鸸鹋 鵕鸃 鸜鸲 鸱鸺 狒狒 猩猩 骐骝 鹍鹏 孔雀 鹔鷞 熠爚(熠耀:萤虫,也作形容词)蛜蝛 鹙鸲 蝼蚁 甴曱 骊駹 【亻、人 旁】伎俩 倥偬 倥侗 伶俐 伶仃 伶俜 伾伾 倜傥 伛偻 侏儒 侘傺 俣俣 偲偲 侁侁 伙伴 低回 侥幸 从容 佻(亻达)俾倪 俇俇 偓促 傒倖(幸) 偓佺 仿佯 依倚 傥荡 似的 优柔 仳离 俘虏 优游 仔细 依稀 偏袒 凭陵 仟眠 信誓 偃蹇 偿还 依违 仓猝 仓皇 便悁 儃回 伏待 仓促 便娟 伏羲 【艹 禾旁】苍茫 苍莽 蕴籍 荟萃 草莽 葳蕤 菁菁 蓁蓁 菶菶 茏葱 萋萋 蔓延 苒苒 萧萧 芊芊 蓓蕾 蓊郁 薿薿 芃芃 菲薄 茌苒 芥蒂 蓬莱 蒶蕴 荒唐 蒙眛 蕞尔 荒诞 落泊 萧条 蓬勃 苗条 芊绵 莽撞 落拓 芦笙 薄幸 萧瑟 莞尔 茕独 英雄 稼穑 秕穅 穰穰 【竹 旁】簏簌 簸箕 笸箩 笸篮 篱笆 笭箵 笊篱 箢箕 符箓 笤帚 笙簧 箜篌 籧篨 笼统 笼络 筛糠 箕踞 【氵 旁】汹涌 澎湃 漭漭 潆洄 沄沄 淋漓 混沌 澒洞 漂渺 淅沥 湝湝 沮洳 湉湉 泠泠 潺湲 泥泞 滂沱 浩渺(淼) 滴溜 漂泊 泣涕 潇洒 潇湘 潢洋 漫漶 活泼 湑湑 浪漫 汩没 没治 潋滟 漩涡 汍澜 浩荡 滑稽 溟蒙 洪荒 沆瀣 汎滛 淟涊 滂沛 泛滥 涤荡 溯洄 汪洋 涕泗 淫溢 溜达(蹓跶) 泼辣 温暾 流离 滑稽 潦草 鸿蒙 渨涹 涟漪 漼溰 濩渃 沧浪 浽溦 滃郁 【彳 旁】徘徊 彷徨 徜徉 行径 徂往 行当 彳亍 徙倚 彷佛 往返 循环 【玉 王 旁】玎玲 璀璨 琳琅 琅玕 玛瑙 玎珰(丁当)琉璃 琥珀 玻璃 珐琅 玓瓅 玲珑 瑊玏 斑斓 珑璁 琬圭 琢磨 琵琶 瑟瑟 琬琰 琼瑶 璎珞 瑰玮 望洋 【扌 旁】掇撺 掂掇 挣扎 扶摇 招摇 抖擞 拮据 抠搜 搭挡 提拨 按捺 挣揣 振振 拂菻 技击 捧哏 掂量 搭讪 担当 招架 抑郁 揶榆 挥霍 捣蛋 扬榷 排场 扬长 招待 扶疏 扑簌 摇曳 拨剌 抵牾 推移 【月 旁】胭脂 朦胧 腼腆 肮脏 腽肭 膀胱 膨脝 臃肿 腌臜 脑筋 肝胆 胼胝 腥膻 胳膊 肋脦 服膺 胡同 胡涂 肸蚃 【木 旁】榔槺 模棱 栏杆 榾柮 榜样 櫹椮 桔槔 栲栳 桎梏 模糊 枯槁 梼昧 樗蒲 栖栖 栖迟 杂沓 横亘 枷锁 栽培 槎枒 【土 旁】垃圾 坷垃 圹埌 圪落 坎坷 圪垯 垓埏 堡垒 埤堄 乾坤 培塿 疆场 壅蔽 【口 囗 旁】唠叨 啰嗦 哆嗦 叮咛 嗫嚅 吩咐 唱喏 咆哮 嚎啕 咿哑 咕噜 嘱咐 喃喃 呋喃 嘟囔 呫嗫 喇嘛 呻吟 咿唔 嘲哳 呶呶 吆呼 哎哟 哎呀 呜呼 喧哗 哐啷 呼哨 嚏喷 哩噜 唧嚷 咕咚 呐喊 叱咤 喀嚓 唱和啁啾 哽咽 嗈嗈 唢呐 喇叭 喽啰 吁嗟 唏嘘(欷歔)喷薄 嚆矢 唼蹀 嘹亮 含糊 囹圄 团圞 团团 团圆 囫囵 圆场 困惑 啙窳 吝啬 古董 古拙 局促 可汗 噍噍 【山 旁】崎岖 峥嵘 崚嶒 崴嵬 嵚崟 崔巍 崔嵬 嶕峣 崄巇 嵯峨 嶙峋 巉岩 岹峣 峬峭(庯峭)崦嵫 崱屴 巃嵸 峨嵋 幽默 嵾嵯 巑岏 【忄 心 旁】恍惚 慷慨 惆怅 悻悻 悇憛 懊恼 悱恻 惭愧 懆懆 惺忪 怐愗 怨怼 忉怛 怊怅 忉忉 惽恻 惝恍 憬悟 憧憬 愊忆(腷臆)懵懂 恹恹 慥慥 悼怵 悠悠 憔悴 悁悒 悃愊 慷慨 忸怩 恺悌 戃慌 懭悢 怂恿 忐忑 慭慭 恫吓 惕厉 恫赫 怔营 怔松 恐慌 惨白 恢弘 慰籍 惨淡 懊丧 【石 旁】砏磤 磈硊 碕礒 硱磳 硠礚 硙硙 矻矻 磅礴 碌碡 硫磺 硭硝 碔砆 砥砺 磺胺 【女 旁】妩媚 蜿蜒 婵媛 婵娟 婀娜 姽婳 娉婷 媕娿 姁姁 婉娩 妒嫉 姻娅 妖娆 婆娑 妯娌 妲妃 嫦娥 女娲媞媞 婕妤 媐婗 妊娠 媮娱 委婉 妖冶 娭毑 婵连(蝉连) 婉转 姑息 婞直 嫳屑 委蛇 【辶 走 旁】逶迤 迤逦 邋遢 逡巡 迢递 迍邅 邅迴 邂逅 逍遥 连理 迂缓 迂腐 迷糊 逶随 趔趄 趑趄 【宀 穴 旁】寤寐 安宁 寂寞 寂寥 宇宙 空洞 寒碜 寒暄 窝囊 窘促 牢骚 窈窕 窸窣 窟窿 牢固 【犭 旁】猖獗 狡猾 狼狈 猥獕 猃狁 狰狞 獉狉 狉狉 犹豫 狼籍 猗傩 【足 旁】踌躇 蹒跚 踊跃 踉跄 踸踔(趻踔)踧踖 蹀躞 踟蹰 踯躅 蹂躏 蹉跎 跷蹊 蹭蹬 跼蹐 跋扈 蹛嵲 蹴踘(鞠)跏趺 踽踽 跅驰 【骨 齿 旁】骷髅 髑髅 骨碌 鹘突 骯脏 骨朵 龌龊 齮龁 龂龂 龃龆 【糹 纟 旁】綷縩 缧绁 缥缈 绸缪 缠绵 纥繨 纷纭 纭纭 缤纷 缱绻 继续 绰约 缙绅(搢绅)綝缡(纚) 绵蛮 经纶 络绎 缭绕 纨绔 纠葛 纰漏 累赘 【钅 旁】铿锵 锟铻 锒铛 釬锵(干将) 鏦鏦 销铄 鉏铻 镆铘(莫邪) 铓锣 铴锣 钴鉧 钥匙 锦绣 【饣 旁】饽饽 饸饹 馉饳 饾饤(豆丁) 馄饨( 云吞)饥馑 餦餭 馒头 【页 见 旁】贿赂 颉颃 颞颥 颙颙 颠沛 颠倒 颈链 颓丧 颟顸 觊觎 覶缕 须臾 须知 【目 旁】眼眶 睍睆 瞌睡 矇眬 眩眃(眩晕)睠睠 睊睊 睥睨 睚眦 睖睁 瞻顾 【耳 阝卩 旁】耵聍 陂陀 阢陧 陆续 鄙夷 陆离 郑重 陀螺 卬卬 鄢郢 郁渥 【日 旁】曚昽 昒昕 晧旰 暧昧 旯旮 昆仑 昳丽 晶莹 晏衍 【雨 羽 旁】雰雰 霡霂 霫霫 霶霈 霹雳 零乱(凌乱) 翯翯 翙翙 翱翔 翡翠 翂翐 【车 革 旁】鞦韆(秋千)鞍鞯 鞙鞙 鞲鞴 辘轳 轇轕 轩轾 轩辕 轻盈 辗转 轰动 轰隆 【舟 旁】舳舻 舢舨 舴艋 艅艎 艨艟(蒙冲)盘陀 盘旋 盘桓 盘缠 【衤 旁】褦襶 褴褛 褡裢 裣衽 裲裆 襁褓 装蒜 袅娜 【毛 髟 旁】髢髢 髽髻 鬇鬡 毰毸 毵毵 氍毹 毷氉 【疒 酉 旁】瘛疭 瘭疽 瘰疬 瘫痪 瘌痢 疙瘩 痄腮 痉挛 酕醄 酩酊 醍醐 酝酿 酴醾 酌醴 【马 旁】驰驱 驰骋 骙骙 骎骎 马虎 骄傲 骀荡 骋骛 【讠言 旁】諔诡 谄谀 谗谀 謰謱 謑訽 诟詈 诖误 诘诎 讹诈 讻讻 诽谤 谡谡 謦欬 调谴 【门 匚 罒 旁】匼匝 匹夫 罘罳 阑干 阑珊 阀阅 闶阆 阊阖 阗痫 罗唣 罗锅 羁縻 羁勒 【火 光 小 旁】灿烂 烂漫 熠爚 煜爚 光趟 堂皇 堂倌 燎泡 【虫 旁】螮蝀 虺虺 虺尵 蜎蜎 螺旋 螺陀 蜿蜓 蚴虬 【大 又 旁】夸张 奢侈 契阔 耷拉 支吾 支离 支应 牵强 【米 角 旁】糟糕 糟糠 糟蹋 断肠 精神 料峭 觳觫 解数 觱篥 【方 户 尸 旁】旖旎 敷衍 扊扅 翩跹 屈戌 【其他偏旁】叆叇 玄黄 黪黩 黯黮 黤黮 殷勤 匍匐 尴尬 争衡 乖舛 乖迕 乖忤 乖戾 于嗟 于归 犄角 丹青 商量 辟易氤氲 照耀 畿辅 帡幪 兜鍪 乒乓 无宁(毋宁) 毋庸 冬烘 龙钟 虩虩 正经 於乎(戏)卓跞 欸乃 帷幄 孤拐 参差 留连 么麽 瓜葛 唐突 凄凉 巴结 结巴 凌夷 戋戋 斟酌 摩挲 孟浪 凌驾 鱍鱍 点拨 巾帼 尨茸 甡甡剥削 凛洌 牺牲 牝牡 燕婉 燕燕 切磋 云雨 福禄 判涣 周章 周流 丰隆 张驰 倏忽 倏铄 凄怆 麏麚 鲍肆 罔两 罔愆 矩矱 剞劂 舛错 飘摇 另外,双音节语素还有很多是音译的外来词,如: 剎那 浮屠 菩萨 沙门 琵琶 葡萄 苜蓿 石榴 茉莉 尼龙 咖啡 咖哩 可可 香槟 吐司 雪茄柠檬 芭蕾 坦克 吉普 雷达 沙发 逻辑 摩登 安培 加仑 欧姆



