代码如下:
[DllImport("kernel32")]
private static extern bool ProcessIdToSessionId(int pid,int sid);我用远程桌面控制另一台机器,然后在另一台机器里打开了一个应用程序.
在任务管理器里看,这个应用程序的会话ID是1,即远程会话.
但是,我调用ProcessIdToSessionId函数,它始终返回false,sid的值也始终是0.
系统都是Windows 2003
请大侠帮忙看看..

解决方案 »

  1.   

    你确定传参数是正确的吗?
    用GetLastError看下系统错误代码
      

  2.   

    楼主的声明是错的
    改成
    [DllImport("kernel32")] 
    private static extern bool ProcessIdToSessionId(int pid,out int sid);
    试试
      

  3.   

    饿。。求教,int类型的需要用out么?
      

  4.   

    函数的原型可不是int
    BOOL ProcessIdToSessionId(
      __in          DWORD dwProcessId,
      __out         DWORD* pSessionId
    );
      

  5.   

    这儿扯不到Marshal吧...这儿传的是一个int指
    针.对应的C#声明就是out或ref.而C++声明那里明确的注明
    了是__out所以使用out.如果函数自身要用到这个参数的值做
    输入同时用它做输出的话,则改用ref.
    要用Marshal就很烦了.首先你得分配一个int大小的空间.获得
    对应的IntPtr,然后把这个指针传过去.接着等函数返回后再用
    Marshal从这个指针处读出对应的int,再释放掉申请的内存.要多
    敲多少行代码啊...
      

  6.   

    我试了,如果声明为
    [DllImport("kernel32")] 
    private static extern bool ProcessIdToSessionId(int pid,out int sid);
    我调用的时候:
    ...
    if(ProcessIdToSessionId(pid,sid))
    {}
    ...
    编译不通过,错误提示为:
    1."参数'2' : 无法从'int'转换为'out int'"
    2."与'Process.Form1.ProcessIdToSessionId(int, out int)'最匹配的重载方法具有一些无效参数"
      

  7.   

    回复2楼:
    GetLastError好像是System.Web下的吧?我的程序都是在System.Win下,能用不?
    高手指教!!
      

  8.   

    if(ProcessIdToSessionId(pid,sid)) 
    {} 《《这句有点问题if(ProcessIdToSessionId(pid,out sid)) 
    {} GetLastError是winform下的^^
      

  9.   

    OK,唉,都怪自己学艺不精..
    非常感谢hilarymoggy,ChrisAK帮忙...