![]() |
PInvoke problema (C#) !
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 . |
тут
что-то подобное обсуждалось... |
ничего не нашел ?
ya iskal otvet etom voprose v google , no ничего не нашел ! :cray:
drugie idea est ? za ranie spasiba . |
Возможно, необходимо поэкспериментировать с типами в C# варианте. Например, поле dwFileSize типа DWORD64 в C# объявлено как int, хотя скорее всего нужен long. (int - 32 бита). Так же не уверен о типе BOOL в C++ варианте. Возможно, соответствующие поля на C# нужно объявить, как int, т.к. насколько помню, BOOL в WinAPI объявлен как int. Не уверен, что можно напрямую превращать массив wchar_t в string. Возможно, нужно попробовать в C# объявить эти поля как массивы char[] или даже byte[]. Не совсем понятно и что такое SYSTEMTIME и чем он заменен на C#.
|
Цитата:
Вместо MyStruct MyFunction(param1) написал int MyFunction(param1, MyStruct &my) Если есть исходники на С можно поступить так, если нет то написать враппер и уже из под С# вызывать враппер. |
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 ! |
Цитата:
xoroshiy idea , |
naverno moy problema etot mesta
wchar_t wszName[256]; wchar_t wszFullPath[2048]; v C# kak mojna opredelit etot parametri ili struktura Node_Ex ? |
Nematjon, а вы можете залить этот импортируемый .dll файл сюда на форум? (rapidshare.com, filefactory.com, ifolder.ru...)
|
Цитата:
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); -ток тож не знаю правильно ли это... :( |
| Текущее время: 14:06. Часовой пояс GMT +5. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод:
OOO «Единый интегратор UZINFOCOM»