C++ cli 宏与C+的偏移量+/CLI
offsetof宏在C++/CLI下似乎不起作用 这在非托管C++中很好,但抛出“错误C2255:‘实体’:非法使用这个类型作为表达式:CLI.< /P>中的错误” struct Property{ char* label; PropertyTypes type; unsigned int member_offset; unsigned int position; unsigned char bit_offset; }; struct Enti
offsetof宏在C++/CLI下似乎不起作用 这在非托管C++中很好,但抛出“错误C2255:‘实体’:非法使用这个类型作为表达式:CLI.< /P>中的错误” struct Property{ char* label; PropertyTypes type; unsigned int member_offset; unsigned int position; unsigned char bit_offset; }; struct Enti
我正在为库编写一个CLI包装器,并且我想要上述结构类型的等价物。我一直在考虑使用列表作为向量的等价物,如下所示: struct Params { // values... } struct Settings { std::vector<Params> m_params; // values... } public value struct Params { // values... } public value struct Settings
我有一个.Net DLL,我需要从第三方应用程序调用它。第三方应用程序不支持加载托管DLL,因此我使用的是C++ + CLI DLL,它公开了应用程序调用的本机C++函数,如下所示。 第三方应用程序->c++/cli DLL->.Net DLL 我的问题是,当我的c++/Cli dll尝试从.Net dll调用函数时,会因“访问冲突”错误而崩溃。如果直接从VC++控制台应用程序调用.Net DLL,则不会出现此问题 在visual studio中创建clr选项设置为true的c++/cli dl
我正在为本机第三方库制作一个C++/CLI包装器,代码如下: #pragma once #include <Codegen.h> #include <string> using namespace System; namespace CodegenWrapper { public ref class CodegenWrapper { private: Codegen * codegen; public:
我不清楚c++/cli到底是如何工作的……clr不会让托管代码看到您的本机类,也不会将所有内容编译为托管代码。它只允许您将托管代码添加到C++项目中。这是通过C++/CLI语言扩展实现的,即:生成ref类而不是标准类 /clr:pure标志将所有内容编译为非本机托管代码,但需要对源代码进行重大更改才能编译 clr不会使托管代码看到您的本机类,也不会将所有内容编译为托管代码。它只允许您将托管代码添加到C++项目中。这是通过C++/CLI语言扩展实现的,即:生成ref类而不是标准类 /clr:pur
这是书面代码 void horizontal_calculate() { String ^aa = filenames[0]; std::string file1(marshal_as<std::string>(aa)); String ^bb = filenames[1]; std::string file2(marshal_as<std::string>(bb)); double Result3=horizontal_read
有没有一种方法可以在没有BOM的情况下使用FileStream编写流? 我在这里要做的是首先将一个XmlNode转换为一个流,然后在某个时间点将该流写入一个文件。我需要它以流的形式,以便与我的功能互操作。我可以用另一种方法,但如果可能的话,我想用这种方法 Stream^ XmlToStream(XmlNode^ Node) { Stream^ stream = gcnew MemoryStream(); XmlDocument^ xmlDoc = gcnew XmlDocume
我是一个处理图像的新手。我需要使用System.Drawing名称空间,当我尝试这样做时:使用名称空间System::Drawing我有一个错误,系统尚未声明。我该怎么办?包括一些东西?你需要#使用,当然它必须是CLR项目。闻起来好像你忘了添加引用。但由于它不喜欢这个系统,您可能使用了错误的项目模板来开始。您必须从CLR节点中选择一个。System::Drawing所能做的大部分事情都可以通过#包括gdiplus.h在本机代码中获得
在C#和VB.Net中,我可以使用CallerMemberNameAttribute以字符串形式获取调用程序的名称: public void Caller([CallerMemberName]string memberName = "") { Debug.Print(memberName); } 我想在C++/CLI中也这样做,但不知何故,我无法让它正常工作。尝试了几种构造,我开始怀疑C++/CLI编译器是否支持此属性 以下是一个(简化的)实现: using namespace Syst
正如标题所说,我必须创建一个可以接受数组作为参数的类 以下是头文件的当前版本: public ref class MyClass { public: MyClass() {}; MyClass(array<int, 2> ^(&A1), const int &i2) : A1(A1), I2(i2) {}; String^ Method(); ~MyClass() {}; private: array<int,
使用“C++托管扩展”的版本中的声明如下所示: void MangToUnMangDateTime(System::DateTime & managedDT, tm& unmangDT); 注意:第一个参数(managedDT)是此问题的相关参数。这将导致该方法的以下msil(使用ildasm.exe找到): 第一次尝试: 我第一次尝试在C++/CLI中向前声明此方法,结果如下所示: void MangToUnMangDateTime2(System::DateTime % m
有点好奇到底有多少人使用C++/CLI?那么有多少人在使用它呢?是否有特定的工作,人们只在管理环境下寻找程序员?围绕c++/cli的社区有多大?从我所看到的到目前为止,有相当多的语法变化,这是我应该学习的,作为C++程序员吗?另外,是C++/CLI,C++?NET?我对微软的任何事情都一无所知 C++/CLI对于在托管代码和非托管代码之间架起桥梁是必要的,因为您无法完全享受100%托管代码的编写。这可能会发生,如果你不能重写你的整个C++应用程序在托管代码中,由于大量的限制,因此,随着时间的推移
我以前遇到过这个问题,但从未遇到过这样的情况。我完全糊涂了。如问题所述,我得到了运行时错误“对象引用未设置为对象的实例”。使用调试器工具,我认为我已将问题精确定位到这一行: dataFileLocation=path; 整个功能如下: void DATReader::SetPath(字符串^path) { 如果(!File::存在(路径)) { MessageBox::Show(“DATReader(缺少dat文件:\n”+path+“\n)”,“Error”,MessageBoxButton
我正试图用C++/CLI应用程序为我的西门子公司写一些东西 读取正常(除了第一次读取时给出奇数值) 但是写作是做一些完全不同于我想要的事情 您可以在下面找到代码: private: void WriteSiemensDB() { byte* buffer; if (ConnectToSiemensPLC()) //Check if you are connected to PLC { String^ msg;
本博客不推荐: 但我还是想做。我想我需要用某种#if或#ifdef之类的东西来包装我的Debug.Assert。另外,是否有人在C++CLI中有Debug.Assert的好例子 假设我有以下变量:String^validationError=bldError.ToString() 现在我想做一些类似的事情: #if (DEBUG) Debug.Assert(false, "Got the following validation error:" + validationError); #end
OperationCallbackInfo是在AAA.dll中定义的类 我的问题是:符号^和%在参数中是什么?< p>这意味着你所拥有的不是真正的C++,而是C++的/CLI,微软专有的.NET ./p>语言版本。 如果内存服务,>%s/COD>是“跟踪引用”的语法。这意味着(至少相当)与C中的代码> REF < /C> >。从C++的观点来看,它与定义一个参数作为指针的引用几乎是一样的。在托管C++中,只处理 ^ < /C>,这与^ %不完全相同。@ Brendan Long:它不是复制品。
在一个文件中,我遇到了一个问题 我正在实现库中编写的接口的功能 库中函数的声明如下所示: COMWORKSPACELib.IWorkspaceEvents.WorkspaceMessage(int, string, COMWORKSPACELib.EnumNotificationCode, COMWORKSPACELib.EnumNotificationType, string, ref COMWORKSPACELib.EnumNotificationReply); 当我在CLI\C++中编写
我有一个关于cli/c++环境中运算符重载的问题 static Length^ operator++(Length^ len) { Length^ temp = gcnew Length(len->feet, len->inches); ++temp->inches; temp->feet += temp->inches/temp->inchesPerFoot; temp->inches %= temp->inchesPer
我有一个c++/cli类库项目。我需要导入C++本地链接。它们是这样宣布的 class __declspec(dllexport) Check { const char* type; protected: int val; public: Check(int); Check(); const char* Type(); void Type(const char*); virtual int Val(); void Val(int); ~Che
我已经完成了非常简单的设置——我只为一个函数创建了包装器,以查看是否一切正常。但在我创建包装器实例时,我的应用程序get的异常“LoaderLock被检测到”,并显示以下消息: DLL“c:\path\CPPWrapper.DLL”为 正在尝试在OS加载程序锁内执行托管执行。不要试图 在DllMain或映像初始化函数中运行托管代码 因为这样做会导致应用程序挂起 如果我关闭“LoaderLock”异常的中断,我会得到“FileLoadException未处理”: 知道我做错了什么吗?我怎样才能解决
这是我以前的一个查询()的继续。我正在从C++/CLI应用程序访问基于xml的活动报告。是否有任何方法可以从C++/CLI与活动报告进行数据通信,例如,我想在应用程序访问的XML报告的详细信息部分打印C++/CLI应用程序中存在的托管数据。我不想使用任何c代码。能做到吗?谢谢。当然,ActiveReports可以做到。由于C++/CLI生成标准的.NET对象,您可以在C++/CLI中创建对象,ActiveReports将绑定到这些对象。创建要绑定到的对象的IEnumerable集合(集合中的每个
解释。你可以回答这个问题。它是如何引用c的?我相信我可以很容易地用c编写类似的代码,并引起同样的奇怪行为。因此,使用c#的用户可能会遇到同样的问题,我在这里给出了一个解决方案。此外,我认为问题与IL或JIT编译器有关,因此它也与.net有关。非静态类方法隐藏了用于访问类成员的“this”参数。所以,当使用null引用调用此类方法时,它可能无法尝试访问类成员。但一般来说,这是未定义的行为,它可能会在呼叫线路上崩溃。@AlexFarber:谢谢你的解释。你可以回答这个问题。它是如何引用c的?我相信我
我的.h文件: #pragma once namespace Project1 { ... this->button2->Click += gcnew System::EventHandler(this, &MyForm::button2_Click); ... } 在我的.cpp文件中,我尝试这样做: #include "MyForm.h" using namespace System; using namespace System::Windows::Form
这是我的密码: using namespace System; using namespace System::Collections; using namespace System::Collections::Generic; using namespace System::Collections::ObjectModel; public ref class DataMatrix : public System::Collections::ObjectModel::ObservableCol
如果我使用BackgroundWorker创建两个线程,其中一个线程正在写入类的静态成员变量,而另一个线程正在读取,这是否会导致应用程序崩溃 如果否,C++/CLI如何处理它 提前感谢。它本身不会导致应用程序崩溃。它会导致未定义的行为。这意味着,或多或少,任何事情都可能发生 你说的是比赛条件。这些都是不好的;编写多线程代码时,您的主要任务是防止这些情况发生。所以C++/CLI本身不处理这些问题?由开发商决定?谢谢
我尝试使用C++/CLI对内置String类进行扩展,并从C++/CLI使用它,但没有成功 以下是我能将其归结为的最简单的方法: [System::Runtime::CompilerServices::Extension] public ref class MyStringExtensions abstract sealed { public: [System::Runtime::CompilerServices::Extension] s
代码是: private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Shell("maplestory.exe") 你要么需要从.NET库中获取,要么需要调用Windows API。也许你需要System.Shell.execute?很好,它很快就解决了,但当我在youtube上看到tuts时,当人们可以点击按钮时,他们会得到一个简短的代码,开始时是私有子按钮
如何将字符串^转换为字符串?我做了很多尝试,这是一个: string y = ""; String ^x = "Hi"; y = y + x; /#包括 System::String*str=S“Hello world\n”; const\uuuuwchar\u t\uuuuuu pin\u ptr*str1=PtrToStringChars(str); wprintf(str1); 我不知道是否有直截了当的方法,但你可以试试这个 wchar_t* str = x.Data(); std::w
[问题]WinSCP可以处理连接目录吗 我正在使用C++/CLI编写一个使用WinSCP.NET程序集(版本5.5.3)的SFTP程序。我的程序读取计划文件。最初,get文件的源路径必须是绝对路径。现在我必须支持相对路径,我遇到了一个问题 以下是尝试获取主目录中的所有文本文件。当然,我也希望获得主目录中所有子目录中的所有文本文件。因此,我使用: transferOptionObject->FileMask = "*.txt"; transferResult = sftpSession-&g
前面的+与gcnew关键字一起使用时意味着什么不同?+=运算符不适用于gcnew运算符,但适用于接收的数据事件。您正在使用“gcnew”运算符在托管堆上实例化一个新的SerialDataReceiveDevenHandler委托,您正在使用+=运算符将其添加到DataReceived事件的调用列表。运算符+=不适用于gcnew运算符,但适用于DataReceived事件。您正在使用“gcnew”运算符在托管堆上实例化一个新的SerialDataReceiveDevenHandler委托,并使用+
我正在尝试动态创建System::DateTime的实例,并将其分配给System::DateTime gDate,以防用户使用'p'参数。但是,我得到了代码片段后面显示的错误 case 'P': gDate=new DateTime(std::stoi(year), std::stoi(month), std::stoi(day)); cout << "Persian Date is: " << pDate.GetDayOfMonth(g
我想检查我的C++/Cli管理的自动根目录是否为空。下面是我如何进行的: auto_gcroot<RefClassA^> m_a; if (static_cast<RefClassA^>(m_a) != nullptr) { ..... } auto_gcroot m_a; 如果(静态_-cast(m_-a)!=nullptr) { ..... } 问题是我得到了一个错误: '不存在从'auto_gcroot'到对象^ 正如我在评论中
我想通过了解窗口句柄来找出窗口的顶级组件名称。 这是在托管C++代码中这样做的: //handle is the window handle as int System::Windows::Forms::Control^ c = Control::FromHandle((System::IntPtr)System::Convert::ToInt32(handle)); System::Type^ t= c->GetType(); Console::WriteLine(t->FullN
总之,我有一个C头,看起来像这样: // packer.h typedef struct { int left; int top; int right; int bottom; } frame_t; typedef struct { /* IN */ int width; int height; /* OUT */ frame_t view; frame_t dest; } image_t; typedef st
但是,我现在尝试在C++/CLI中创建一个NUnit测试DLL,它加载与上述应用程序相同的非托管DLL并运行相同的代码。我想做的是将_matherr函数添加到C++/CLI dll中,这样当出现数学错误时,我就可以执行一些自定义处理程序逻辑 C++/CLI dll在定义了_matherr函数的情况下编译得很好,但是当我从非托管dll强制执行数学错误时,不会调用_matherr函数 C++/CLI不支持这一点吗?MSDN文档似乎说_matherr受所有C运行时的支持(带有指向包括/clr运行时在内
在哪里 EventSource是发布事件的类 instanceOfEventSource是该类的一个实例 EventSource::MyEventHandlerElegate是事件的委托类型 MyEventHandlerMethod是当前类(其中“this”是实例)中的一个(非静态)方法,其签名与EventSource::MyEventHandlerElegate匹配 在C++/CLI中正确的语法是什么?该语法类似于C#,换句话说,+=被重载以实现这一点: instanceOfEventSo
此代码拒绝编译: #include <vcclr.h> struct contained { typedef System::Int32 type; }; int main(array<System::String ^> ^args) { auto a = System::Int32::Parse("0"); auto b = contained::type::Parse("0"); return 0; } 在自动b行上。但是,如果
我有一个问题(我认为它可以很容易地解决,但它让我发疯)。我查看了其他帖子,但没有找到解决方案 我想使用C++/CLI将二进制文件读入结构。问题是,在读取后,某些值与正确的值不匹配。在下面的示例中,所有结构字段都会被很好地读取,直到“a”(包含)(大约字节100)。从该字段中,其余字段的值错误。我知道它们的值是错误的,源文件是正确的,因为我以前使用过python,以及C++/CLI中的FileStream和BinaryReader。但是,我不再使用它们,因为我想将二进制文件读入结构 此外,在某些情
我在C#DLL中定义了如下函数: public class Class1 { public static dynamic CS_Func() { dynamic obj = new ExpandoObject(); obj.num = 99; return obj; } } 在另一个C#EXE中,可以这样调用它: public void CS_Caller() { dynamic obj = Class1.CS_F
我正在尝试编写一个混合模式DLL,我们称之为“客户机”,用它们的托管等价物替换一些非托管类。在我的个人机器上,一切都很好,但是当我签入源代码时,我们的构建机器不会构建项目。它无法识别我正在使用的另一个DLL(称为“Core”)中的托管类 我认为这个问题与预编译头有关。原因如下: 为了使用“Core”中的类,我在“Client”项目中添加了对“Core”项目的引用。如果我删除此引用,然后在我的个人计算机上构建项目,它仍然有效。但是,CLR PCH在删除引用后不会重新编译。如果我重新编译CLR PC
我正在用C++/CLI编写一个库,其中一个函数返回System::Drawing::Color对象。我添加了System.Drawing作为项目参考。它起作用了 然后我创建了一个测试应用程序来链接到这个库,并添加了我创建的库作为引用。一切都链接良好,但随后我尝试运行应用程序,出现错误单元测试适配器引发异常:无法加载一个或多个请求的类型。有关详细信息,请检索LoaderExceptions属性。。我不知道如何访问此LoaderException属性 通过在测试项目中向System.Drawing添
有人能给我解释一下下面的代码片段吗 value struct ValueStruct { int x; }; void SetValueOne(ValueStruct% ref) { ref.x = 1; } void SetValueTwo(ValueStruct ref) { ref.x = 2; } void SetValueThree(ValueStruct^ ref) { ref->x = 3; } ValueStruct^ first =
我对这件事很失望。我试图在C++/CLR中扩展一个C#创建的接口。接口有一个方法,我已经在我的类中声明了它,但是编译器一直告诉我,我仍然必须为接口方法提供一个实现。我还能做什么?我错过了什么 有没有人举过如何在CLR中扩展C#接口的例子?我想出来了!我需要使元素的实现虚拟化。我希望这能帮助其他人解决同样的问题
我尝试编译一个C++/CLI文件,其中包括一个头文件(本机,第三方),其中定义了一个类“Foo”。此外,我正在通过使用“Bar.dll”使用一个C#dll,其中定义了一个名称空间“Foo”。编译器给出错误C2872“Foo是不明确的符号” 我不知道本机类“Foo”是在哪个命名空间中定义的,因为头文件中的类定义没有嵌套在某个命名空间中。所以我假设类“FoO”可能没有命名空间(C++中可能,不是吗?)否则,我将指定类“Foo”及其命名空间,使其特定于编译器 我可以将“Bar.dll”中使用的名称空间
我是CLR的新手,正在阅读setWindowPos的c++/CLI文档,函数的定义如下 BOOL WINAPI SetWindowPos( _In_ HWND hWnd, _In_opt_ HWND hWndInsertAfter, _In_ int X, _In_ int Y, _In_ int cx, _In_ int cy, _In_ UINT uFlags ); 我有C++的经验,所以我理解,例如
我接收到远程地址的参数是,然后需要将其转换为常量uint8*。前一个是强制性的,我不能改变任何东西。remoteAddress必须作为FREObject接收,然后在const uint8*中进行转换 我遇到的问题是,我必须将String^传递给Ping类,而不是constuint8*并且我不知道如何将constuint8*转换为String^。你有什么想法吗 下面是我代码的一部分: // argv[ARG_IP_ADDRESS_ARGUMENT holds the remoteAddress v
没有与这些操作数匹配的运算符:visual studio c++;窗口窗体错误 private:System::Void按钮1\u单击(系统::对象^sender,系统::事件参数^e) { 长mb=15001; 长sb=1500001; 长msb=25000001; 如果(tc
程序关闭时,我的应用程序会崩溃。否则运行正常。 设置: -Visual Studio 2012(x64 Windows 7) -C++/CLI与本机代码DLL的混合(本机代码为Boost Asio) -与DLL链接的CLR控制台应用程序 当我“调试”崩溃时,会显示相关消息: 未处理的异常。。。0xC002001:字符串绑定无效 我找到了这个描述错误的MS简介: 概括地说,当托管代码与非托管代码不正确地混合时,就会发生这种情况。 但是,我无法确定我的代码在哪里被错误地混合 文件“unmanaged
我使用注册表并使用函数RegNotifyChangeKeyValue。第一个选项需要注册表项句柄(HKEY),但我有RegistryKey,可以从中获取SafeRegistryKey(key->handle) 错误:“类型为Microsoft::Win32::SafeHandles::SafeRegistryHandle”的参数与类型为“HKEY”的参数不兼容 如何获取HKEY?需要进行转换才能从安全句柄类中包装的IntPtr获取本机句柄。看起来是这样的: HKEY handle = (H
我的问题是: 我想用索引号展开用户在SaveFileDialog中给程序的文件名。 我从对话框中获取完整路径,并在其中搜索“.” System::String^ str = saveFileDialog1->FileName; pin_ptr<const wchar_t> wch = PtrToStringChars(str); size_t convertedChars = 0; size_t sizeInBytes = ((str->Leng