安装钩子,托管C++中的字符串及其它
2006-07-20 11:42:41 来源:WEB开发网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过程设置使用解压包
更多精彩
赞助商链接