有关unmanaged函数调用managed实例

Scorpiour 2013-09-04 10:18:19
最近遇到一个很困扰的难题:

在进行clr开发的时候,将数据从managed code中转成unmanaged并不麻烦,但是在unmanaged部分处理完毕之后希望将数据送回Managed部分时却遇到了麻烦。

代码的结构:

[code=c/c++]
//程序会生成一个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;
}

[/code]
到这里,数据被重新封装进了String^可供使用了,但是我发现无论如何我都无法获取Form的实例入口,更不要说调用其内部的函数了……传统的Unmanaged指针对Managed Code并不适用,而即使我可以传出this指针,我也不知道这个this指针的类型到底是什么……

因此各种求助……
...全文
814 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Scorpiour 2013-09-04
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
msdn查C++ 委托
好吧 我目前找到的msdn C++ delegate都是单向的或者指向managed instance中unmanaged的部分……
真相重于对错 2013-09-04
  • 打赏
  • 举报
回复
msdn查C++ 委托
Scorpiour 2013-09-04
  • 打赏
  • 举报
回复
引用 3 楼 hdt 的回复:
我觉得说的够具体的 先确定一个前提,那个非托管函数应该是你写的或者是你能给修改它,否则你也不会想把form传给它。因为如果你不能修改的话,传给他也没用 1、返回值 既然你能修改,如果是单线程的话你可以直接用返回值在事件函数里修改界面 2、回掉 如果是多线程,修改那个函数加一个函数指针参数,把一个委托传给他,在委托函数里面修改界面
是多线程。 unmanaged函数指针和managed函数之间无法互相转换。例如 [code=c/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 } [/code]
真相重于对错 2013-09-04
  • 打赏
  • 举报
回复
我觉得说的够具体的 先确定一个前提,那个非托管函数应该是你写的或者是你能给修改它,否则你也不会想把form传给它。因为如果你不能修改的话,传给他也没用 1、返回值 既然你能修改,如果是单线程的话你可以直接用返回值在事件函数里修改界面 2、回掉 如果是多线程,修改那个函数加一个函数指针参数,把一个委托传给他,在委托函数里面修改界面
Scorpiour 2013-09-04
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
你可以用很多种方式达到你的效果 1、返回值 2、回掉函数
求具体一点的例子。 比如说返回值——我现在的情况是无法获取实例,那么入口都找不到的情况下就谈不上返回值了
真相重于对错 2013-09-04
  • 打赏
  • 举报
回复
你可以用很多种方式达到你的效果 1、返回值 2、回掉函数

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧