2013-04-23 32 views
-1

我有编译进Win32和CE 5 dll的C++代码。看到我正在编译这两个平台,我在C++中使用预处理器定义在必要时进行隔离。问题从C#传递结构,并在CE上的非托管C++ DLL中修改

这两个dll都是从C#,.NET 3.5 for Win32应用程序和.NET 2.0 for CE应用程序调用的。

一切都在Win32中完美工作,但我无法从CE中的dll函数返回。从C#调用的dll函数有一个结构指针作为参数,结构内容(包括字符串类型)在dll函数中被修改。

这里的C++函数声明:

DWORD __declspec(dllexport) ExtSomeFunc(LPTSTR szReader, MY_STRUCT* myStruct) 

,并在C#:

[DllImport("somelibrary.dll", EntryPoint = "ExtSomeFunc", CharSet = CharSet.Unicode)] 
private static extern uint ExtSomeFunc([MarshalAs(UnmanagedType.LPWStr)] string szReaderName, ref MY_STRUCT myStruct); 

下面是在C结构声明++:

struct MY_STRUCT 
{ 
    LPTSTR szString1; 
    LPTSTR szString2; 

    MY_STRUCT() 
    { 
     szString1 = new wchar_t[32]; 
     szString2 = new wchar_t[20]; 
    } 

    ~MY_STRUCT() 
    { 
     delete []szString1; 
     delete []szString1; 
    } 
}; 

而在C#:

public struct MY_STRUCT 
{ 
    [MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 32)] 
    public string szString1; 

    [MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 20)] 
    public string szString2; 

    public MY_STRUCT(string szInit) 
    { 
     this.szString1 = szInit; 
     this.szString1 = szInit; 
    } 
} 

这里是怎么叫的C#函数的:

string szReader = "SomeDeviceName"; 
uint uiRet = 0; 
MY_STRUCT myStruct = new MY_STRUCT(""); 

uiRet = ExtSomeFunc(szReader, ref myStruct); 

那么是什么发生的事情是,如果我试图用字符串比长度6更高的填充结构的字符串,

wcscpy(myStruct->szString1, L"1234567"); 

StringCchCopyW(myStruct->szString1, sizeReq+1, L"abcdefg"); 

C#永远不会从dll函数返回。使用一些测试文件日志记录我可以看到字符串被填充并且函数完成,但C#只是在应该返回时挂起,我需要重启CE设备才能恢复。

现在已经敲了我的头几天了。这显然是与.NET 2.0或CE 5的东西,只是不知道如何解决它。

在此先感谢!

+0

长度是固定的,所以我能得到其与该工作在C++结构'wchar_t的szString1 [SOME_LEN];'和这个在C#结构'[MarshalAsAttribute(UnmanagedType.ByValTStr,SizeConst = SOME_LEN) ]' – alexsd 2013-04-26 16:27:16

回答

0

尝试巡演C#中的结构定义之前添加:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] 
  • 的包值必须是你的结构字节对齐。
+0

我会试试看。 – alexsd 2013-04-26 16:29:12

+1

和?它为你工作? – Adi 2014-09-29 15:46:33