喜CHAPS(和chappettes)从C#中的常规DLL调用函数 - 内存分配问题?
与导出功能
INT GetGroovyName(INT grooovyId,字符* pGroovyName,诠释由bufSize)
基本上你传递一个ID一个常规的C DLL( int),一个预先分配了内存的char *缓冲区和传入的缓冲区的大小。
pGroovyName被填充一些文本。 (即它的基于groovyID的查找)
问题是我该如何最好地从c#中调用?
欢呼
巴兹
喜CHAPS(和chappettes)从C#中的常规DLL调用函数 - 内存分配问题?
与导出功能
INT GetGroovyName(INT grooovyId,字符* pGroovyName,诠释由bufSize)
基本上你传递一个ID一个常规的C DLL( int),一个预先分配了内存的char *缓冲区和传入的缓冲区的大小。
pGroovyName被填充一些文本。 (即它的基于groovyID的查找)
问题是我该如何最好地从c#中调用?
欢呼
巴兹
您可以在C#中使用的DllImport。
检查从MSDN
using System;
using System.Runtime.InteropServices;
class Example
{
// Use DllImport to import the Win32 MessageBox function.
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
static void Main()
{
// Call the MessageBox function using platform invoke.
MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
}
}
在C#侧这http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx
代码,你会:
[DllImport("MyLibrary")]
extern static int GetGroovyName(int grooovyId, StringBuilder pGroovyName, int bufSize);
而你把它想:
StringBuilder sb = new StringBuilder (256);
int result = GetGroovyName (id, sb, sb.Capacity); // sb.Capacity == 256
+1 - 使用StringBuilder比在我的例子中使用char []更好。 – 2009-11-18 00:11:54
有一个看看这个片段演示(理论上)应该如何看待:
using System;
using System.Runtime.InteropServices;
using System.Text; // For StringBuilder
class Example
{
[DllImport("mylib.dll", CharSet = CharSet.Unicode)]
public static extern int GetGroovyName(int grooovyId, ref StringBuilder sbGroovyName, int bufSize,)
static void Main()
{
StringBuilder sbGroovyNm = new StringBuilder(256);
int nStatus = GetGroovyName(1, ref sbGroovyNm, 256);
if (nStatus == 0) Console.WriteLine("Got the name for id of 1. {0}", sbGroovyNm.ToString().Trim());
else Console.WriteLine("Fail!");
}
}
我设置了StringBuilder的是256最大容量,你可以定义更小的东西,假设它返回0就是成功,它打印出的字符串值为1的常规ID,否则打印失败。 希望这有助于。 Tom
-1您发布的示例不允许通过非托管代码修改字符串。 – Gonzalo 2009-11-18 00:09:02