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应用程序中的枚举崩溃 在我的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"
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();