有关unmanaged函数调用managed实例
最近遇到一个很困扰的难题:在进行clr开发的时候,将数据从managed code中转成unmanaged并不麻烦,但是在unmanaged部分处理完毕之后希望将数据送回Managed部分时却遇到了麻烦。
代码的结构:
//程序会生成一个managed WinForm实例
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew(mainForm));
//mainForm class的定义是
public ref class mainForm : public System::Windows::Forms::Form
{
//在某些Event触发的时候,会将String转成wchar_t[],并且送去unmanaged进行处理
private: System::Void textBox2_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
if(e->KeyChar == 13)
{
if(this->textBox2->Text->Length)
{
entryPtr->SendAsyncMessage(this->textBox2->Text,(void*)(pDataQueue));
//这里的entryPtr是一个unmanaged class指针,SendAysncMessage可以将String^转变成wchar_t[]并发送给其他的unmanaged 函数
//然后问题出现了,在对数据处理结束之后,我希望能够将数据送回到Form中
//比如最后一步的处理函数
static int formProcFunc(pIQueueNode ptr)
{
wchar_t* wstr = (wchar_t*)(ptr->getValue());
size_t len = wcslen(wstr);
array<wchar_t>^ arr = gcnew array<wchar_t>(len);
for(size_t i=0;i<len;i++)
{
arr[i] = wstr[i];
}
System::String^ str = gcnew System::String(arr);
return 0;
}
到这里,数据被重新封装进了String^可供使用了,但是我发现无论如何我都无法获取Form的实例入口,更不要说调用其内部的函数了……传统的Unmanaged指针对Managed Code并不适用,而即使我可以传出this指针,我也不知道这个this指针的类型到底是什么……
因此各种求助…… --------------------编程问答-------------------- 你可以用很多种方式达到你的效果
1、返回值
2、回掉函数
--------------------编程问答--------------------
求具体一点的例子。
比如说返回值——我现在的情况是无法获取实例,那么入口都找不到的情况下就谈不上返回值了
--------------------编程问答-------------------- 我觉得说的够具体的
先确定一个前提,那个非托管函数应该是你写的或者是你能给修改它,否则你也不会想把form传给它。因为如果你不能修改的话,传给他也没用
1、返回值
既然你能修改,如果是单线程的话你可以直接用返回值在事件函数里修改界面
2、回掉
如果是多线程,修改那个函数加一个函数指针参数,把一个委托传给他,在委托函数里面修改界面
--------------------编程问答--------------------
是多线程。
unmanaged函数指针和managed函数之间无法互相转换。例如
--------------------编程问答-------------------- msdn查C++ 委托 --------------------编程问答--------------------
int(__clrcall *pF)(IMessage);//的话
pF = mainForm::myFunc; //那么myFunc的定义必须是
ref class mainForm : public System::Windows::Forms::Form
{
//...
static int __clrcall myFunc(IMessage);
};
//这样一来就出现一个问题:
int mainForm::myFunc(IMessage msg)
{
//如何获取mainForm的实例?static成员是无法访问非静态成员变量的
}
//但是如果不使用static的话,类似的代码会直接报错:
int UnmanagedClass::initDelegate(int(__clrcall *pF)(IMessage))
{
int(__clrcall *delegate)(IMessage);
delegate = pF;
return 0;
}
mainForm::mainForm()
{
UnmanagedClass* classPtr = new UnmanagedClass;
classPtr->initDelegate(myFunc); //这行会报错,除非myFunc()被定义为static
}
好吧
我目前找到的msdn C++ delegate都是单向的或者指向managed instance中unmanaged的部分……
补充:.NET技术 , VC.NET