我对 C++ 很陌生,遇到了一个我无法解决的问题。我正在尝试将 System::String 转换为 wchar_t 指针,该指针可以保留的时间超过函数的作用域。一旦我完成了它,我想正确地清理它。这是我的代码:
static wchar_t* g_msg;
void TestConvert()
{
pin_ptr<const wchar_t> wchptr = PtrToStringChars("Test");
g_msg = (wchar_t*)realloc(g_msg, wcslen(wchptr) + 1);
wcscpy(g_msg, wchptr);
free (g_msg); // Will be called from a different method
}
Run Code Online (Sandbox Code Playgroud)
当调用 free 时,我收到“检测到堆损坏:在 0x02198F90 处的正常块(#137)之后”。
为什么我会收到这个错误?
安德鲁·L
我必须有一个表单作为gui,但我还需要使用win32 API编写,因为我需要在应用程序启动时创建另一个进程...
我创建了Win32控制台 - >空项目..然后有一个选项将Windows窗体添加为UI ...是否可能???? ...因为我选择了基础项目为win32控制台应用程序.
但我真的需要应用程序中的表单.
如何使用共享内存段在两个托管进程之间共享数据?我"object"在C++/CLI代码中使用,在另一个进程中与内存的其他部分共享数据.我正在使用以下代码段.
#define BUFFER_SIZE 32768
#pragma data_seg (".SHAREDMEMORY")
bool _Locked = false;
bool _Initialized = false;
unsigned char[10000] data = NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:.SHAREDMEMORY,RWS")
Run Code Online (Sandbox Code Playgroud)
但我需要它:
#pragma data_seg (".SHAREDMEMORY")
bool _Locked = false;
bool _Initialized = false;
object^ _object = nullptr;
#pragma data_seg()
#pragma comment(linker,"/SECTION:.SHAREDMEMORY,RWS")
Run Code Online (Sandbox Code Playgroud)
这是说,"global or static variable may not have managed type System::Int32^"并给出其他错误"missing ; before '^'".
我必须将.NET "Control" 对象的数据复制到此共享段,我需要将其传输到另一个进程.
当我尝试将c ++/cli值结构定义为字典中的TValue时,我在c ++/cli中的语法有问题
我这样做是因为我想在本机类指针和system :: String(以String作为键)之间维护一个映射,因此将本机指针包装在一个struct中.
value struct MyStruct
{
NativeClass *m_p;
}
Dictionary<System::String ^, MyStruct> MyMap;
NativeClass* FindLigandModelMap(System::String ^file)
{
MyStruct m;
if (m_LigandToModelMap.TryGetValue(file, %m)) <--- ERROR HERE
return(m.m_p);
return(NULL);
}
Run Code Online (Sandbox Code Playgroud)
Thi给出了编译器错误:错误C2664:'System :: Collections :: Generic :: Dictionary :: TryGetValue':无法将参数2从'MyStruct ^'转换为'MyStruct%'
我尝试了MyStruct的各种声明但没有成功.
我在这里和互联网上搜索过,似乎没有人遇到类似的问题,我无法弄清楚为什么我不能让这个工作.
阻止我编译的那一行是:
LitCiterCommon::LitCiterTrace->Init();
Run Code Online (Sandbox Code Playgroud)
如果我LitCiterTrace.Init()从另一个文件(c#)调用它编译得很好,但由于某种原因我无法从托管cpp调用它.
任何想法或建议?
我在C++ CLI中的代码:
[System::Runtime::CompilerServices::ExtensionAttribute]
public ref class MyExtensions abstract sealed {
public:
[System::Runtime::CompilerServices::ExtensionAttribute]
static System::String^ SetC() {
return gcnew System::String("{") + gcnew System::String("}") ;
}
}
Run Code Online (Sandbox Code Playgroud)
但是后面的行抛出一个错误,即String没有成员SetC.
System::String("").SetC();
Run Code Online (Sandbox Code Playgroud)
我也试过使用以下代码:
gcnew System::String("")->SetC();
Run Code Online (Sandbox Code Playgroud)
什么错过了吗?
我已经使用C#一段时间了,这次我试图用C ++编写.NET应用程序。在C#中,我可以很容易地从代码中访问托管资源,资源文件的名称就像一个类一样工作,因此,如果在名为cba.resx的资源文件中有一个名为“ abc”的字符串,只需编写cba.abc与资源文件中的字符串一起返回。甚至intellisense也可以使用它。同样的东西也可以使用图标等。
是否可以在C ++中做同样的事情,如果可以,怎么做?否则,访问资源文件中的字符串/图标的最简单方法是什么?
我厌倦了在托管 C++ 应用程序中搜索如何使用 user.config 而不是 app.config。我发现的所有内容都是关于 C# 的,我无法弄清楚如何转换为 C++(属性命名空间不存在)
任何人都可以让我了解这一点吗?我需要知道如何创建、读取和写入 user.config 文件。
谢谢
我正在使用一些使用UDP向我发送字节数组的服务.这个服务应用程序是用C语言开发的 - 这个字节数组是一个C结构.
我知道我可以在C#上重新定义这个结构,并使用StructLayout属性使成员具有相同的对齐方式(我是对的吗?)
但是可以使用托管C++/CLI定义相同的结构并将此托管C++代码导入到我的C#项目中并以此方式进行序列化吗?
如果这是可能的 - 那该怎么做?当我谷歌它时,我找不到任何例子.
使用 C++/CLI 我想声明一个列表的列表。
在声明常规列表时,我写道:
List<String^>^ NameOfList = gcnew List<String^>(2);
因此,我试图声明一个列表的列表,如:
List<List<String^>^>^ AnotherName = gcnew List<List<String^>(2)>(2);
但是,Microsoft Visual Studio 抱怨右手边的论点说它无效。
注意,我可以创建一个空列表
List<List<String^>^>^ AnotherName;
这工作正常。有人知道这里有什么问题吗?
c++-cli ×10
c# ×4
.net ×3
managed ×2
clr ×1
declaration ×1
dictionary ×1
ipc ×1
list ×1
resx ×1
user.config ×1
visual-c++ ×1
winapi ×1