2009-11-17 46 views
0

喜CHAPS(和chappettes)从C#中的常规DLL调用函数 - 内存分配问题?

与导出功能

INT GetGroovyName(INT grooovyId,字符* pGroovyName,诠释由bufSize)

基本上你传递一个ID一个常规的C DLL( int),一个预先分配了内存的char *缓冲区和传入的缓冲区的大小。

pGroovyName被填充一些文本。 (即它的基于groovyID的查找)

问题是我该如何最好地从c#中调用?

欢呼

巴兹

回答

1

您可以在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); 
    } 
} 
+0

-1您发布的示例不允许通过非托管代码修改字符串。 – Gonzalo 2009-11-18 00:09:02

3

在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 
+0

+1 - 使用StringBuilder比在我的例子中使用char []更好。 – 2009-11-18 00:11:54

0

有一个看看这个片段演示(理论上)应该如何看待:

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

+0

你打我吧贡萨洛.... :) – t0mm13b 2009-11-18 00:11:00

+0

嘿。顺便说一句,没有'ref'那里需要... – Gonzalo 2009-11-18 00:18:11

+0

嗨有 当我从这个例子中进入dll的sbGroovyNm是一个糟糕的指针和崩溃的应用程序... 所以DLL不认为有内存分配给sbGroovyNm 嗡嗡声 – Buzz 2009-11-18 00:41:17