从DllImport启动的c ++方法的访问冲突

时间:2015-05-14 18:39:04

标签: c# c++ pinvoke dllimport access-violation

我对DllImport启动的一些方法有一些奇怪的问题。

在本机c ++中,我有代码:

#define BUFSIZE 4096

int _tmain(int argc, _TCHAR* argv[])
{
    wchar_t *tekst = L"D:\\matiz\\Dokumenty\\!FIRMA TRIM-POT\\Firmowe";
    PrintTekst(tekst);
}

bool PrintTekst(wchar_t *tekst)
{   
    DWORD  retval = 0;
    BOOL   success;
    TCHAR  buffer[BUFSIZE] = TEXT("");
    TCHAR  buf[BUFSIZE];
    TCHAR** lppPart = { NULL };
    retval = GetFullPathNameW(tekst, BUFSIZE, buffer, lppPart);
    return true;
}

bool __stdcall PrintTekstExtern(wchar_t *tekst)
{
    return PrintTekst(tekst);
}

当我直接从main函数调用 PrintTekst 方法时,一切正常,但是当我使用DllImport调用此方法时,在线:

TCHAR  buffer[BUFSIZE] = TEXT("");

我有访问冲突异常。这是非常奇怪的情况,因为实际上我不使用任何参数,在这种情况下来自经理代码。

方法,在c#中启动:

[DllImport("Pointers.exe", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
public static extern bool PrintTekstExtern(string tekst);

static void Main(string[] args)
{
    string cos = @"D:\matiz\Dokumenty\visual studio 2013\Projects\Pointers\PointersSharp\bin\Debug";
    var status = PrintTekstExtern(cos);
}

}

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

最大的问题是您尝试从可执行文件而不是DLL导入函数。这是首先要解决的问题,也是导致致命事故的真正原因。

除此之外,非托管功能是:

bool __stdcall PrintTekstExtern(wchar_t *tekst)

你的p / invoke是:

[DllImport("...", CallingConvention = CallingConvention.StdCall, 
    CharSet = CharSet.Auto)]
public static extern bool PrintTekstExtern(string tekst);

这里有一个小问题。返回值被编组为4字节布尔类型,但非托管代码使用1字节类型。在此处阅读:http://blogs.msdn.com/b/jaredpar/archive/2008/10/14/pinvoke-and-bool-or-should-i-say-bool.aspx

通过改变p / invoke来解决这个问题:

[DllImport("...", CallingConvention = CallingConvention.StdCall, 
    CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.U1)]
public static extern bool PrintTekstExtern(string tekst);

我还建议使用CharSet.Unicode,因为非托管代码使用wchar_t,因此明确使用16位文本。