|
|
Знаете ли Вы, что ... | |
...нарушения правил форума наказываются. Старайтесь их не нарушать. | |
<< Предыдущий совет - Случайный совет - Следующий совет >> |
.NET & ASP.NET Вопросы программирования .NET, ASP.NET, Web Services и других WEB-технологий .NET. |
Ответить |
|
Опции темы | Опции просмотра |
29.05.2009 18:06 | #1 | ||
-
Developer
Сообщений: 8
+ 0
0/0
– 0
0/0
|
u menya est struktura v C app .
typedef struct _Node_Ex { BOOL bFolder; BOOL bHidden; wchar_t wszName[256]; wchar_t wszFullPath[2048]; SYSTEMTIME stDateCreated; SYSTEMTIME stDateModified; int nCountOfChilds; DWORD64 dwFileSize; HTREEITEM hItem; } Node_Ex; i funksiya : extern "C" __declspec(dllexport) Node_Ex GetNode_Ex(int n); ----------------------------------- C# code : [StructLayout(LayoutKind.Sequential,CharSet=CharSet .Unicode,Pack=1)] public struct Node_Ex { public bool bFolder; public bool bHidden; [MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 256)] public string wszName; [MarshalAsAttribute(UnmanagedType.LPWStr, SizeConst = 2048)] public string wszFullPath; public SYSTEMTIME stDateCreated; public SYSTEMTIME stDateModified; public int nCountOfChilds; public int dwFileSize; public HTREEITEM hItem; //IntPtr }; [DllImport(DLLNAME)] public static extern Node_Ex GetNode_Ex(int n); kagda ya ispolzuyu etot funksiya , u menya oshibka vot tak Method's type signature is not PInvoke compatible . Kak reshit etogo problema ? Spasiba . |
||
|
Ответить |
30.05.2009 11:54 | #4 |
Возможно, необходимо поэкспериментировать с типами в C# варианте. Например, поле dwFileSize типа DWORD64 в C# объявлено как int, хотя скорее всего нужен long. (int - 32 бита). Так же не уверен о типе BOOL в C++ варианте. Возможно, соответствующие поля на C# нужно объявить, как int, т.к. насколько помню, BOOL в WinAPI объявлен как int. Не уверен, что можно напрямую превращать массив wchar_t в string. Возможно, нужно попробовать в C# объявить эти поля как массивы char[] или даже byte[]. Не совсем понятно и что такое SYSTEMTIME и чем он заменен на C#.
__________________
Веб-разработчик |
|
|
Ответить |
30.05.2009 13:42 | #5 | |
Сообщений: 3,327
+ 337
892/590
– 3
31/25
|
Цитата:
Вместо MyStruct MyFunction(param1) написал int MyFunction(param1, MyStruct &my) Если есть исходники на С можно поступить так, если нет то написать враппер и уже из под С# вызывать враппер. |
|
|
Ответить |
30.05.2009 13:54 | #6 |
-
Developer
Сообщений: 8
+ 0
0/0
– 0
0/0
|
struktura SYSTEMTIME obyavlena v WinBase.h .
[StructLayout(LayoutKind.Sequential)] public struct SYSTEMTIME { [MarshalAs(UnmanagedType.U2)] public ushort Year; [MarshalAs(UnmanagedType.U2)] public ushort Month; [MarshalAs(UnmanagedType.U2)] public ushort DayOfWeek; [MarshalAs(UnmanagedType.U2)] public ushort Day; [MarshalAs(UnmanagedType.U2)] public ushort Hour; [MarshalAs(UnmanagedType.U2)] public ushort Minute; [MarshalAs(UnmanagedType.U2)] public ushort Second; [MarshalAs(UnmanagedType.U2)] public ushort Milliseconds; //public SYSTEMTIME(DateTime dt) //{ // Year = (short)dt.Year; // Month = (short)dt.Month; // DayOfWeek = (short)dt.DayOfWeek; // Day = (short)dt.Day; // Hour = (short)dt.Hour; // Minute = (short)dt.Minute; // Second = (short)dt.Second; // Milliseconds = (short)dt.Millisecond; //} } typedef unsigned long DWORD; typedef int BOOL; Ya testiroval vse vozmojnie variante (char , char [] ,string, byte , long , ... ) no kajdiy raz eto problema ! |
|
Ответить |
30.05.2009 13:56 | #7 | ||
-
Developer
Сообщений: 8
+ 0
0/0
– 0
0/0
|
Цитата:
xoroshiy idea , |
||
|
Ответить |
Реклама и уведомления | |
30.05.2009 23:01 | #9 |
Nematjon, а вы можете залить этот импортируемый .dll файл сюда на форум? (rapidshare.com, filefactory.com, ifolder.ru...)
__________________
http://i29.tinypic.com/2u6o65y.jpg |
|
|
Ответить |
31.05.2009 21:38 | #10 |
Сообщений: 1,306
+ 885
788/480
– 0
51/26
|
мож так
char[] wszName; char[] wszFullPath; а потом инициализировать _Node_Ex(bool superFkt) { wszName= new char[256]; wszFullPath =new char[2048]; } а вызывать так... _Node_Ex n1 =new _Node_Ex(true); n1= (_Node_Ex)GetNode(1); но это может совcем быть не правельно... -так себе придумала но я б на вашем месте не выкручивалась а попробывала написать просто DLLNAME.Node_Ex n1=GetNode(1); -ток тож не знаю правильно ли это... Последний раз редактировалось Наташа; 31.05.2009 в 21:53. |
|
Ответить |
|