Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;.net应用程序中的枚举崩溃 在我的C.NET .NET应用程序中,我使用DllImport的C++ DLL。 C++ DLL包含一个EnUM定义: enum mode { A, B, C }; class myClass { char name[512]; mode myMode; //variables beneath this line cause crash char pass[512]; };_.net_C++_Interop_Dllimport - Fatal编程技术网

C++;.net应用程序中的枚举崩溃 在我的C.NET .NET应用程序中,我使用DllImport的C++ DLL。 C++ DLL包含一个EnUM定义: enum mode { A, B, C }; class myClass { char name[512]; mode myMode; //variables beneath this line cause crash char pass[512]; };

C++;.net应用程序中的枚举崩溃 在我的C.NET .NET应用程序中,我使用DllImport的C++ DLL。 C++ DLL包含一个EnUM定义: enum mode { A, B, C }; class myClass { char name[512]; mode myMode; //variables beneath this line cause crash char pass[512]; };,.net,c++,interop,dllimport,.net,C++,Interop,Dllimport,我在C#.Net应用程序中定义了相同的enum: 现在,如果我访问myMode行之后定义的myclass变量,我会得到一个内存损坏错误: getName(); //ok getPass(); //error extern "C" LPCTSTR FAR PASCAL EXPORT getPass() { return myC->pass; } C#包装: 作为一种解决方法,我使用int作为myMode的类型,一切正常。但我很好奇如何做对。你写道: // .cpp extern "C"

我在C#.Net应用程序中定义了相同的
enum

现在,如果我访问
myMode
行之后定义的
myclass
变量,我会得到一个内存损坏错误:

getName();  //ok
getPass(); //error

extern "C" LPCTSTR FAR PASCAL EXPORT getPass() { return myC->pass; }
C#包装:

作为一种解决方法,我使用
int
作为
myMode
的类型,一切正常。但我很好奇如何做对。

你写道:

// .cpp
extern "C" LPCTSTR FAR PASCAL EXPORT getPass() { return myC->pass; }

// .cs
[DllImport(DLLNAME)]
public static extern string GetPass();
嗯。。。应该这样吗

[DllImport(DLLNAME)]
public static extern string getPass();
我不知道C#是否区分大小写,但恐怕是


另一个我无法理解的技巧是
LPCTSTR
。由于使用了
char[]
,它是否应该是
LPCSTR
?而且,嗯。。。C#真的需要
PASCAL
convention吗?

C++枚举是编译时的“虚构”(就像内联函数和模板一样)。编译后,它们与INT不可区分。C++抽象是……C++中的代码> char []/COD>这真的很难看。顺便说一句,可能存在缓冲区溢出,因为
名称
长度可能大于512。在这种情况下,
name
(以及
myMode
之后的所有成员都将损坏。只是一个没有看到实际代码的建议,though@maverik:没有缓冲区溢出。我使用简单的测试值。问题要么在于您没有向我们展示的代码中,要么在于导入中,因为呈现的代码是清晰的。可能你可以显示更多的代码,例如
getName()
getPass()
方法?这是一个旧的DLL,我想FAR和PASCAL不再需要了。对不起,拼写错误:应该在C++和C++中获得GETPASS()。但问题不在于方法。我得到了至少20个具有相同签名的getter方法,但只有那些在模式行崩溃后返回内容的方法。如果您可以执行以下操作,则将
模式
声明为
枚举模式{A=0xFFFFFFF0,B=0xFFFFF1,C=0xFFFFF2}
并检查应用程序是否崩溃。别忘了告诉我们结果。如果我按照你的建议去做的话,它会崩溃的。有趣的是,getMode()调用可以工作,但getPass()的调用不能。更奇怪的是,它取决于mode myMode在我的类中的位置。
// .cpp
extern "C" LPCTSTR FAR PASCAL EXPORT getPass() { return myC->pass; }

// .cs
[DllImport(DLLNAME)]
public static extern string GetPass();
[DllImport(DLLNAME)]
public static extern string getPass();