uForum.uz

uForum.uz (https://uforum.uz/index.php)
-   .NET & ASP.NET (https://uforum.uz/forumdisplay.php?f=159)
-   -   PInvoke problema (C#) ! (https://uforum.uz/showthread.php?t=9313)

Nematjon 29.05.2009 18:06

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 .

DarkUser 29.05.2009 19:58

тут
что-то подобное обсуждалось...

Nematjon 30.05.2009 10:01

ничего не нашел ?
 
ya iskal otvet etom voprose v google , no ничего не нашел ! :cray:


drugie idea est ?
za ranie spasiba .

Andrew Sklyarevsky 30.05.2009 11:54

Возможно, необходимо поэкспериментировать с типами в C# варианте. Например, поле dwFileSize типа DWORD64 в C# объявлено как int, хотя скорее всего нужен long. (int - 32 бита). Так же не уверен о типе BOOL в C++ варианте. Возможно, соответствующие поля на C# нужно объявить, как int, т.к. насколько помню, BOOL в WinAPI объявлен как int. Не уверен, что можно напрямую превращать массив wchar_t в string. Возможно, нужно попробовать в C# объявить эти поля как массивы char[] или даже byte[]. Не совсем понятно и что такое SYSTEMTIME и чем он заменен на C#.

shumbola 30.05.2009 13:42

Цитата:

Сообщение от Nematjon (Сообщение 224723)
ya iskal otvet etom voprose v google , no ничего не нашел ! :cray:


drugie idea est ?
za ranie spasiba .

Я когда-то сталкивался с подобной проблемой и пошел по пути наименьшего сопротивления, изменил свою функцию так, чтобы результат возвращался через параметр:
Вместо MyStruct MyFunction(param1) написал int MyFunction(param1, MyStruct &my)

Если есть исходники на С можно поступить так, если нет то написать враппер и уже из под С# вызывать враппер.

Nematjon 30.05.2009 13:54

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 !

Nematjon 30.05.2009 13:56

Цитата:

Сообщение от shumbola (Сообщение 224769)
Цитата:

Сообщение от Nematjon (Сообщение 224723)
ya iskal otvet etom voprose v google , no ничего не нашел ! :cray:


drugie idea est ?
za ranie spasiba .

Я когда-то сталкивался с подобной проблемой и пошел по пути наименьшего сопротивления, изменил свою функцию так, чтобы результат возвращался через параметр:
Вместо MyStruct MyFunction(param1) написал int MyFunction(param1, MyStruct &my)

Если есть исходники на С можно поступить так, если нет то написать враппер и уже из под С# вызывать враппер.


xoroshiy idea ,

Nematjon 30.05.2009 14:23

naverno moy problema etot mesta

wchar_t wszName[256];
wchar_t wszFullPath[2048];

v C# kak mojna opredelit etot parametri ili struktura Node_Ex ?

Khamza Davletov 30.05.2009 23:01

Nematjon, а вы можете залить этот импортируемый .dll файл сюда на форум? (rapidshare.com, filefactory.com, ifolder.ru...)

Наташа 31.05.2009 21:38

Цитата:

Сообщение от Nematjon (Сообщение 224780)
wchar_t wszName[256]; wchar_t wszFullPath[2048];

мож так
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. Перевод: zCarot
OOO «Единый интегратор UZINFOCOM»