/////////////////////////////////////////////////////////////////////////////////////
// 函数功能:
// 列表所支持TOKEN的连接名称
// 函数参数:
// szTokenName: 输出参数,所有指定类型的TOKEN连接名称
//   不同的TOKEN之间以'\0'作为分割符
// pulTokenNameLen: 输入参数,szTokenName的缓冲区的最大长度
//   实际返回的总的连接名称的长度
// ulTokenType: 输入参数,连接类型
// pvReserved: 输入参数,保留扩展使用,目前只支持NULL
/////////////////////////////////////////////////////////////////////////////////////
long __stdcall MWTokenList(
char* szTokenName, 
unsigned long * pulTokenNameLen, 
unsigned long ulTokenType,
const void* pvReserved);
/////////////////////////////////////////////////////////////////////////////////////
// 函数功能:
// 连接一个TOKEN,获得TOKEN的操作句柄
// 函数参数:
// plTokenHandle: 输出参数,返回TOKEN的连接句柄
// szTokenName: 输入参数,所要连接TOKEN的连接名称,通过MWTokenList函数获得
// ulTokenMode: 输入参数,连接模式,是连接类型和共享模式的或关系
// pvReserved: 输入参数,保留扩展使用,目前只支持NULL
/////////////////////////////////////////////////////////////////////////////////////
long __stdcall MWTokenConnect(
long* plTokenHandle, 
const char* szTokenName, 
unsigned long ulTokenMode, 
const void* pvReserved);MFC里面的调用:
         unsigned long ulTokenType;
unsigned long ulTokenMode;
unsigned long ulTokenNameLen;
char szTokenName[100];
long m_lTokenHandle; lResult = MWTokenList(szTokenName,&ulTokenNameLen,ulTokenType,0);   lResult = MWTokenConnect(&m_lTokenHandle,szTokenName,ulTokenMode,0); 这是我在C#里面自己定义的原型        public static extern long MWTokenList(byte[] szTokenName, ref ulong pulTokenNameLen, ulong ulTokenType, string/long  pvReserved);        public static extern long MWTokenConnect(ref long plTokenHandle, byte[] szTokenName, ulong ulTokenMode, string/long pvReserved);调用都有问题  请大家帮忙想方法, 感谢ing

解决方案 »

  1.   

    把每个参数的数据类型一一对照好.C++            C#
    =====================================
    WORD            ushort
    DWORD           uint
    UCHAR           int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
    UCHAR*          string/IntPtr
    unsigned char*  [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
    char*           string
    LPCTSTR         string
    LPTSTR          [MarshalAs(UnmanagedType.LPTStr)] string
    long            int
    ulong           uint
    Handle          IntPtr
    HWND            IntPtr
    void*           IntPtr
    int             int
    int*            ref int
    *int            IntPtr
    unsigned int    uint
    COLORREF        uint 
      

  2.   


    [dllimport("dllname",CharSet=CharSet.Auto,CallingConvention=CallingConvention.Winapi]
            public static extern int MWTokenList(string szTokenName, ref uint pulTokenNameLen, uint ulTokenType, IntPtr  pvReserved); 
    [dllimport("dllname",CharSet=CharSet.Auto,CallingConvention=CallingConvention.Winapi]
            public static extern int MWTokenConnect(ref int plTokenHandle, string szTokenName, uint ulTokenMode, IntPtr pvReserved); 
      

  3.   

    方法的参数和返回值的类型可能不同,对照表 
    C++            C# 
    char*        string 
    传出的char*      StringBuilder 
    short            short 
    char              byte 
    char[n]          fixed byte[n] 
    结构指针          结构指针 
    函数指针          委托 
    结构体数组使用IntPtr http://topic.csdn.net/u/20090225/15/a6bc50ad-9721-4749-b189-dc4a4bc045a1.html