当前位置:编程学习 > C#/ASP.NET >>

有关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、回掉函数
--------------------编程问答--------------------
引用 1 楼 hdt 的回复:
你可以用很多种方式达到你的效果
1、返回值
2、回掉函数

求具体一点的例子。

比如说返回值——我现在的情况是无法获取实例,那么入口都找不到的情况下就谈不上返回值了
--------------------编程问答-------------------- 我觉得说的够具体的
先确定一个前提,那个非托管函数应该是你写的或者是你能给修改它,否则你也不会想把form传给它。因为如果你不能修改的话,传给他也没用
1、返回值
既然你能修改,如果是单线程的话你可以直接用返回值在事件函数里修改界面
2、回掉
如果是多线程,修改那个函数加一个函数指针参数,把一个委托传给他,在委托函数里面修改界面
--------------------编程问答--------------------
引用 3 楼 hdt 的回复:
我觉得说的够具体的
先确定一个前提,那个非托管函数应该是你写的或者是你能给修改它,否则你也不会想把form传给它。因为如果你不能修改的话,传给他也没用
1、返回值
既然你能修改,如果是单线程的话你可以直接用返回值在事件函数里修改界面
2、回掉
如果是多线程,修改那个函数加一个函数指针参数,把一个委托传给他,在委托函数里面修改界面


是多线程。

unmanaged函数指针和managed函数之间无法互相转换。例如

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++ 委托 --------------------编程问答--------------------
引用 5 楼 hdt 的回复:
msdn查C++ 委托

好吧
我目前找到的msdn C++ delegate都是单向的或者指向managed instance中unmanaged的部分……
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,