安装钩子,托管C++中的字符串及其它
2006-07-20 11:42:41 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

Type t = myObj.GetType();
Module m = t.Module;
IntPtr h = Marshal.GetHINSTANCE(m);
你也可以在没有对象实例的情况下用 typeof(C++)来获取类型信息,如:typeof(MyApp)。告诉你的客户一定要使用在调用模块中实现的类型。如果使用某些其它类型——例如,String 之类的框架类型——你得到的模块是错误的。
Figure 1 示范了一个简单的 C# 控制台例子,ShowModule,它阐明了这一点。运行画面如 Figure 2 所示。ShowModule 显示的模块信息包括两种类型的 HINSTANCE:应用自身定义了MyApp 类,而 String[](String 数组)类型在 mscorlib 中定义。

Figure 2 模块信息
我要如何将 MFC CString 转换为托管 C++ 中的 String?我有一个函数是这样的:
int ErrMsg::ErrorMessage(CString& msg) const
{
msg.LoadString(m_nErrId);
msg += _T("::Error");
return -1;
}
我如何用托管 C++ 重写这个函数,并用 String 替换参数中的 CString?我不知道如何声明参数,如何处理 const,以及如何从资源文件中加载托管 String。我看了文档说 String 是不能被修改的,因为它们是不可变的,但我有想修改传递的字符串。
Sumit Prakash
这个问题涉及到几个方面,所以让我们一个一个来解决。首先是 const 的声明。在 .NET 框架中是没有常量方法这种概念的,所以你要忘掉它,每办法,只能这么做。其次,如何声明新的函数。你确信你要将 CString 修改为 String,但到底用什么样的语法呢?你的函数修改传递的 CString,这就是你使用引用的原因。在 .NET 中,String 确实是不可变的。你不能修改一个 String 的内容。所有修改 String 的方法实际上都返回一个新的 String。例如:String* str = S"hello";
str = str->ToUpper();
String::ToUpper 返回一个新 String,你可以赋值给 str。如果你想修改 String,必须使用另外一个类,也就是 StringBuilder。但这里你是不需要 StringBuilder 的,因为你并不真正修改这个 String,你修改的是引用它的变量。为了弄明白这一点,考虑一下在 C# 中你的函数会是什么样子:
- ››安装与卸载Win 8双界面应用程序
- ››安装CentOS的注意事项
- ››安装 Intel C++ Compiler 12 以后,VC6 不能编译的...
- ››安装win 8 让Win7与Win8双系统共存
- ››安装YLMF OS及VBox增强功能
- ››安装EPP的调试Zend Debugger
- ››安装并配置SQL Server 2005群集
- ››安装WebSphere WAS应用服务器
- ››安装Android开发工具
- ››安装和卸载Android应用程序(apk包)的命令
- ››安装APK文件到Android模拟器和Android sdcard的使...
- ››安装CentOS oracle过程设置使用解压包
更多精彩
赞助商链接