Вызов API - помогите
От: Аноним  
Дата: 24.02.06 05:44
Оценка:
Почему это прекрасно работает на FW1 и не работает на FW2, и как это исправить, понимаю что с помощью атрибутов, но никак не получается.

Вот фрагмент класса работы с логом телефонных звонков на Pocket PC.Взято с сайта MS (http://msdn.microsoft.com/netframework/programming/netcf/netcfsamples/default.aspx?pull=/library/en-us/dnnetcomp/html/pinvokelib.asp).
Первое поле класса CALLLOGENTRY (uint) должно равняться размеру этого класса. Почему он разный для FW1 И FW2.
При запуске программы на FW2 количество записей определяется правильно , но они пустые все.


using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;

namespace PInvokeLibrary
{
/// <summary>
/// Wraps the Pocket PC Phone API
/// </summary>
public class Phone
{
/// <summary>
/// Private constructor to prevent instantiation
/// </summary>
private Phone(){}

/// <summary>
/// typedef struct
/// {
/// DWORD cbSize;
/// FILETIME ftStartTime;
/// FILETIME ftEndTime;
/// IOM iom;
/// BOOL fOutgoing:1;
/// BOOL fConnected:1;
/// BOOL fEnded:1;
/// BOOL fRoam:1;
/// CALLERIDTYPE cidt;
/// PTSTR pszNumber;
/// PTSTR pszName;
/// PTSTR pszNameType;
/// PTSTR pszNote;
/// } CALLLOGENTRY, *PCALLLOGENTRY;
/// </summary>
public class CALLLOGENTRY : IDisposable
{
public uint cbSize = (uint)Marshal.SizeOf(typeof(CALLLOGENTRY));
public long ftStartTime = 0;
public long ftEndTime = 0;
public IOM iom = 0;
public Flags flags = 0;
public CALLERIDTYPE cidt = 0;
public IntPtr pszNumber = IntPtr.Zero;
public IntPtr pszName = IntPtr.Zero;
public IntPtr pszNameType = IntPtr.Zero;
public IntPtr pszNote = IntPtr.Zero;

public enum CALLERIDTYPE
{
UNAVAILABLE,
BLOCKED,
AVAILABLE
}

public enum IOM
{
MISSED,
INCOMING,
OUTGOING
}

public enum Flags : byte
{
Outgoing = 0x1,
Connected = 0x2,
Ended = 0x4,
Roam = 0x8
}

public enum CallerIDType
{
Unavailable,
Blocked,
Available
}

public enum CallType
{
Missed,
Incoming,
Outgoing
}

// Accessors
public DateTime StartTime { get { return DateTime.FromFileTime(this.ftStartTime); } }
public DateTime EndTime { get { return DateTime.FromFileTime(this.ftEndTime); } }
public CallType CallTyp { get { return (CallType)this.iom; } }
public bool Outgoing { get { return (this.flags & Flags.Outgoing) != 0; } }
public bool Connected { get { return (this.flags & Flags.Connected) != 0; } }
public bool Ended { get { return (this.flags & Flags.Ended) != 0; } }
public bool Roam { get { return (this.flags & Flags.Roam) != 0; } }
public CallerIDType CallerIDTyp { get { return (CallerIDType)this.cidt; } }
public string Number { get { return Marshal.PtrToStringUni(this.pszNumber); } }
public string Name { get{ return Marshal.PtrToStringUni(this.pszName); } }
public string NameType { get { return Marshal.PtrToStringUni(this.pszNameType); } }
public string NoteFile { get { return Marshal.PtrToStringUni(this.pszNote); } }

/// <summary>
/// Clean up string allocations.
/// </summary>

}




/// <summary>
/// Access the phones callog.
/// </summary>
/// <returns>Array of CALLOGENTRY</returns>
public static CALLLOGENTRY[] GetCallLog()
{
IntPtr h = IntPtr.Zero;

try
{
uint lastRecordIndex = 0;
uint position = 0;
CALLLOGENTRY[] entries = null;

PhoneOpenCallLog(out h);

if (h == IntPtr.Zero)
return null;


PhoneSeekCallLog(h, CALLLOGSEEK.END, 0, ref lastRecordIndex);
entries = new CALLLOGENTRY[lastRecordIndex+1];

for (uint i = 0; i <= lastRecordIndex; i++)
{
entries = new CALLLOGENTRY();
PhoneSeekCallLog(h, CALLLOGSEEK.BEGINNING, i, ref position);
PhoneGetCallLogEntry(h, entries[i]);
}

return entries;
}
finally
{
if (h != IntPtr.Zero)
PhoneCloseCallLog(h);
}
}


/// <summary>
/// Open the phone calllog.
/// </summary>
/// <param name="ph">Handle to the log</param>
[DllImport("Phone.dll")]
private static extern void PhoneOpenCallLog(out IntPtr ph);

/// <summary>
/// Close the phone callog.
/// </summary>
/// <param name="h">Open handle to the log</param>
[DllImport("Phone.dll")]
private static extern void PhoneCloseCallLog(IntPtr h);

/// <summary>
/// Get the current calllog entry.
/// </summary>
/// <param name="h">Handle to an open log</param>
/// <param name="pentry">CALLLOGENTRY data</param>
[DllImport("Phone.dll")]
private static extern void PhoneGetCallLogEntry(IntPtr h, CALLLOGENTRY pentry);

/// <summary>
/// Seek start position used by PhoneSeekCallLog seek parameter.
/// </summary>
private enum CALLLOGSEEK
{
BEGINNING = 2,
END = 4
}

/// <summary>
/// Seek to a specific calllog entry.
/// </summary>
/// <param name="hdb">Handle to an open log</param>
/// <param name="seek">Seek starting position</param>
/// <param name="iRecord">Record index from seek start location</param>
/// <param name="piRecord">Index of the record sought</param>
[DllImport("Phone.dll")]
private static extern void PhoneSeekCallLog(IntPtr hdb, CALLLOGSEEK seek, uint iRecord, ref uint piRecord);


}
}

Даже написав простую структуру или класс и замерив её размер через Marshal.SizeOf() получаются разные цифры. Почему она не равна сумме размеров своих полей ( это немного другой вопрос), и почему разные цифры для разных FW и как правильно ?
Как сделать чтобы класс заработал.


[i]данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.