2010-10-03 54 views
1


我试图将C++.NET(托管扩展)应用程序移植到C++/CLI。不过,我的语法还不够强大。C++/CLI代码移植问题

我想要做的是创建一个C Dll文件的包装。

为此,我使用DllImport,但未能找到有关它的使用的文档。由于语法的改变,有一些问题,但我还没有找到原因。

C++.NET线看起来像这样:

[DllImport("my.dll", CharSet = Ansi, CallingConvention = Cdecl, EntryPoint = "#10")] 
static MY_STATUS CPPInit(MY_HANDLE *pLmxHandle); 

想法是的MY_HANDLE一个引用传递到初始化它的功能。一个问题是关键字AnsiCdecl未知。我希望我需要在他们面前展示一些阶级,但没有文档或样本就会有点困难。

我的另一件事是,它返回一个静态字符串的函数:

char *MyFunc(); 

我可以假设它可以映射到String^

在此先感谢。

+1

对于第一个问题:只要将'CharSet = CharSet :: Ansi'和'CallingConvention = CallingConvention :: Cdecl',请参阅http://msdn.microsoft.com/en-us/library/7b93s42f.aspx和http ://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx – rwong 2010-10-03 07:19:44

+1

第二个问题,使用'Marshal.PtrToStringAnsi',请参阅http://bytes.com/topic/c-sharp/回答/ 554501-cc-interop-returning-char – rwong 2010-10-03 07:24:08

+3

为什么你需要在C++/CLI中使用PInvoke,直接调用非托管函数。 PInvoke适用于C#/ VB程序员。 – 2010-10-03 07:37:51

回答

0

感谢您的评论。

我想我自己,我需要建立一个混合模式库,以避免p/invoke。这只是需要一些时间。

其实我以另一种方式解决了编译错误。虽然我还没有测试过它,因为我面临着一些32/64位的问题,这些问题由于Whidbey beta2中的其他错误而无法解决。

我的解决办法是写在样机通过以下方式:

interior_ptr<MY_HANDLE> pMyHandle; 

从我的理解是应该给函数的DLL函数的引用(因此一个地址)。一旦我尝试了,我会看看我的想法是否有效。
否则,我会去下面的选项(我已经提供):

[Out] IntPtr p_MyHandle 

无论如何,我认为这个问题是无法解决的,因为其中的一个应该工作。