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

安装钩子,托管C++中的字符串及其它

 2006-07-20 11:42:41 来源:WEB开发网   
核心提示: int ErrorMessage(ref string msg){msg = ...;return -1;}msg 参数被声明为 ref,意思是说当 ErrorMessage 修改 msg 时,安装钩子,托管C++中的字符串及其它(6),它修改的是传递的变量,而非 String 对象本身,
int ErrorMessage(ref string msg)
{
  msg = ...;
  return -1;
}

msg 参数被声明为 ref,意思是说当 ErrorMessage 修改 msg 时,它修改的是传递的变量,而非 String 对象本身,看下面代码:

string str = "";
err.ErrorMessage(ref str);

现在用空串代替引用,str 引用任何 ErrorMessage 给它指定的串。所以在 C# 中,你可以用 ref 参数。但是在 C++ 中没有 ref 关键字,也没有任何托管的 __ref 关键字。C++ 不需要,因为 C++ 已经具备一个引用机制!并且编译器很灵敏,知道如何处理托管代码。你只要记住在 C++ 中,托管对象总是指针或者句柄。只要用 String* 代替 CString 即可(如果你用的 IDE 是具备 C++/CLI 的 Visual Studio 2005,可以直接用 String 代替 CString)。新的声明方法如下:

int ErrMsg::ErrorMessage(String*& msg){
  msg = "foo";
  return -1; 
}

这样,新函数的参数便是一个对托管 String 指针的引用。如果你想用得暴露一点,甚至可以使用 __gc,比如:

ErrorMessage(String __gc * __gc & msg);

在实际的实现中,你不必使用 __gc,因为编译器知道 String,是一个托管类。如果你使用 C++/CLI,便可以在使用引用到句柄的跟踪(tracking reference-to-handle):

ErrorMessage(String^% msg);

它的意义更加明确。到此故事还没有完结,因为另外还有一个方法声明 ErrorMessage,那就是使用指针到指针的方式:

int ErrMsg::ErrorMessage(String** msg){
  *msg = "foo";
  return -1;
}

即使是在 C++ 中,指针和引用之间的差别是微小的。主要的不同是引用总是必须初始化,不能为 NULL。其它区别主要是语法上的——不论你是使用.还是->反引用。在内部看到的引用都是以指针方式实现的。在 .NET 中,没有指针。万物皆引用。或者说一切都归为一个指针,因为如果你深入到底层的话便可窥见一斑。所以不论是使用引用到指针还是指针到指针,你的 String 参数对于框架以外的世界来说都是一个引用参数。我写了一个 C# 示范程序 RetTest。(参见 Figure 3 和 Figure 4)

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

Tags:安装 钩子 托管

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