GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为啥?
Posted
技术标签:
【中文标题】GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为啥?【英文标题】:What does GetFunctionPointerForDelegate convert a String^ parameter in a delegate into?GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为什么? 【发布时间】:2011-12-02 00:08:19 【问题描述】:我正在尝试使用托管 C++ 将 C# 委托转换为 C++ 函数指针。这是我们之前使用的方法:
// Define a delegate
public delegate void ADelegate(Int32);
ADelegate^ delegateInstance;
// Define a function pointer
typedef void (__stdcall *AFuntionPointer)(int);
AFuntionPointer functionPointerInstance;
// Create an instance of a delegate, using GetFunctionPointerForDelegate
delegateInstance = gcnew ADelegate(this, &AClass::AFunction);
// Convert the delegate to a pointer
IntPtr anIntPtr = Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(delegateInstance);
// Cast the pointer into a function pointer
functionPointerInstance = static_cast<AFuntionPointer>(anIntPtr.ToPointer());
如果我将ADelegate
的参数从Int32
转换为String^
,我应该将AFunctionPointer
的参数更改为什么类型?换句话说,如果我把上面代码的前两行改成:
public delegate void ADelegate(String ^);
ADelegate^ delegateInstance;
我应该如何更改接下来的两行?
// To what type does GetFunctionPointerForDelegate translate String^ to?
typedef void (__stdcall *AFuntionPointer)( /* char*? std::string? */ );
AFuntionPointer functionPointerInstance;
【问题讨论】:
这看起来更像 C++/CLI 而不是托管 C++... 参数是const char*
还是char*
?差别很大。
其实这是我的问题。什么是有效的论点?是char*
、const char*
、std::string
、Cstring
等吗?
我已经更新了上面的文字,以更好地表明这是我的问题,而不是我的代码的一部分。
【参考方案1】:
该委托上的 Marshal::GetFunctionPointerForDelegate() 将生成一个兼容的函数指针
typedef void (__stdcall *AFuntionPointer)( const char* );
String^
编组为 const char*
,除非将 [MarshalAs] 属性应用于委托参数。直接编组到 std::string 是不可能的,pinvoke 编组器对头文件中声明的类的 C++ 对象布局一无所知。
【讨论】:
以上是关于GetFunctionPointerForDelegate 将委托中的 String^ 参数转换为啥?的主要内容,如果未能解决你的问题,请参考以下文章