我对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);
}
}
你能帮帮我吗?
答案 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位文本。