WEB开发网
开发学院软件开发VC 安装钩子,托管C++中的字符串及其它 阅读

安装钩子,托管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),安装钩子,托管C++中的字
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# 中你的函数会是什么样子:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:安装 钩子 托管

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接