标签: c++-cli

尝试释放指针时检测到堆损坏错误

我对 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

memory-management c++-cli

1
推荐指数
1
解决办法
2733
查看次数

Win32控制台应用程序或CLR - > Windows窗体应用程序?

我必须有一个表单作为gui,但我还需要使用win32 API编写,因为我需要在应用程序启动时创建另一个进程...

我创建了Win32控制台 - >空项目..然后有一个选项将Windows窗体添加为UI ...是否可能???? ...因为我选择了基础项目为win32控制台应用程序.

但我真的需要应用程序中的表单.

clr winapi c++-cli

1
推荐指数
1
解决办法
1042
查看次数

我们如何使用共享内存段与两个托管进程之间的"对象"共享数据?

如何使用共享内存段在两个托管进程之间共享数据?我"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" 对象的数据复制到此共享段,我需要将其传输到另一个进程.

.net c# ipc c++-cli shared-memory

1
推荐指数
1
解决办法
2566
查看次数

将C++/cli类指定为Dictionary中的TValue类型的正确语法是什么

当我尝试将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的各种声明但没有成功.

dictionary c++-cli

1
推荐指数
1
解决办法
3002
查看次数

错误C2143:缺少';' 之前' - >'

我在这里和互联网上搜索过,似乎没有人遇到类似的问题,我无法弄清楚为什么我不能让这个工作.

阻止我编译的那一行是:

LitCiterCommon::LitCiterTrace->Init();
Run Code Online (Sandbox Code Playgroud)

如果我LitCiterTrace.Init()从另一个文件(c#)调用它编译得很好,但由于某种原因我无法从托管cpp调用它.

任何想法或建议?

c# c++-cli managed

1
推荐指数
1
解决办法
470
查看次数

为什么C++ CLI不允许使用扩展方法?

我在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)

什么错过了吗?

.net extension-methods c++-cli visual-c++

1
推荐指数
1
解决办法
2772
查看次数

在C ++ / CLI中访问嵌入式资源

我已经使用C#一段时间了,这次我试图用C ++编写.NET应用程序。在C#中,我可以很容易地从代码中访问托管资源,资源文件的名称就像一个类一样工作,因此,如果在名为cba.resx的资源文件中有一个名为“ abc”的字符串,只需编写cba.abc与资源文件中的字符串一起返回。甚至intellisense也可以使用它。同样的东西也可以使用图标等。

是否可以在C ++中做同样的事情,如果可以,怎么做?否则,访问资源文件中的字符串/图标的最简单方法是什么?

.net c# resx c++-cli

1
推荐指数
1
解决办法
2595
查看次数

如何在 C++ cli 中使用 user.config

我厌倦了在托管 C++ 应用程序中搜索如何使用 user.config 而不是 app.config。我发现的所有内容都是关于 C# 的,我无法弄清楚如何转换为 C++(属性命名空间不存在)

任何人都可以让我了解这一点吗?我需要知道如何创建、读取和写入 user.config 文件。

谢谢

c++-cli user.config

1
推荐指数
1
解决办法
4225
查看次数

如何在C#代码中使用c/c ++结构?

我正在使用一些使用UDP向我发送字节数组的服务.这个服务应用程序是用C语言开发的 - 这个字节数组是一个C结构.

我知道我可以在C#上重新定义这个结构,并使用StructLayout属性使成员具有相同的对齐方式(我是对的吗?)

但是可以使用托管C++/CLI定义相同的结构并将此托管C++代码导入到我的C#项目中并以此方式进行序列化吗?

如果这是可能的 - 那该怎么做?当我谷歌它时,我找不到任何例子.

c# c++-cli

1
推荐指数
1
解决办法
1098
查看次数

如何在 C++/CLI 中声明托管列表

使用 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 managed declaration list

1
推荐指数
1
解决办法
5062
查看次数