C++ 如何从本机代码设置TextBox控件中的文本?

C++ 如何从本机代码设置TextBox控件中的文本?,c++,interop,c++-cli,C++,Interop,C++ Cli,是否可以从本机代码操纵.net控件?特别是,我想从一些本机代码设置TextBox的文本。我希望通过这种方式将业务逻辑与用户界面分开,但恰恰是本机代码只知道如何适当地格式化数据(协议中接收的某些字节) 我知道我可以通过handle属性获取窗口句柄,但是一旦到了那里,我将如何调用所需的方法 字符串处理是我唯一的选择吗?本机代码是否应该生成要在控件上显示的消息?设置文本框上文本的“本机”方式是向文本框发送消息: 也请仔细阅读。根据您分配和构建文本的方式,您可能需要使用SendMessage,以避免过早

是否可以从本机代码操纵.net控件?特别是,我想从一些本机代码设置
TextBox
的文本。我希望通过这种方式将业务逻辑与用户界面分开,但恰恰是本机代码只知道如何适当地格式化数据(协议中接收的某些字节)

我知道我可以通过
handle
属性获取窗口句柄,但是一旦到了那里,我将如何调用所需的方法

字符串处理是我唯一的选择吗?本机代码是否应该生成要在控件上显示的消息?

设置文本框上文本的“本机”方式是向文本框发送消息:


也请仔细阅读。根据您分配和构建文本的方式,您可能需要使用
SendMessage
,以避免过早取消分配。

如果您希望将业务逻辑与用户界面分离,并且某些业务逻辑采用本机代码,那么,最好不要直接从本机代码更改任何GUI内容,因为这与您想要实现的恰恰相反。最好尝试在C++/CLI中编写某种包装器方法,从那里调用本机数据格式例程,以便在GUI代码中使用

如果确实希望从本机代码调用托管代码,可以在C++/CLI中声明一个(本机!)静态方法,该方法调用托管方法。你可以将函数指针传递给你的程序的下层(例如,你的本机C++层),可以从那里调用。 大致如下:

// the native code layer:
// "Callbacks.h"
void (*_myNativeCallback)();
void InitCallback(void (*myNativeCallback)())
{
   _myNativeCallback=myNativeCallback;
}
// now you can use _myNativeCallback within your native code


// the C++/CLI layer:
#include "Callbacks.h"
//...
static void MyNativeCallback()
{
    ManagedClass::StaticMethod();
}
InitCallback(MyNativeCallback);
ManagedClass::StaticMethod
中,您可以访问.NET代码,在操作任何形式的
文本框
时应该不会有任何问题。如果必须将本机字符串转换为
System::string
,您可能会发现此代码段非常有用:

inline System::String StdToSysString(const std::string &s)
{
    return gcnew System::String(s.c_str());
}
反过来(假定为Ansi代码页):


不,对不起,我忘了。这是一个C++/CLI windows窗体与本机DLL的“互操作”。你完全正确。但我实际上更多地考虑了本机代码中与GUI相关的对象。不过,你的评论让我重新考虑了一下。顺便说一下,你的代码片段非常有用。谢谢!这似乎正是我想要的。虽然我不确定自己是否理解:P我应该继续读下去。非常感谢你!
inline System::String StdToSysString(const std::string &s)
{
    return gcnew System::String(s.c_str());
}
inline std::string SystemToStdString(System::String ss)
{
    using namespace System::Runtime::InteropServices;
    const char* chars = 
      (const char*)(Marshal::StringToHGlobalAnsi(ss)).ToPointer();
    std::string s = chars;
    Marshal::FreeHGlobal(System::IntPtr((void*)chars));
    return s;
}