【问题标题】:Java JNA cant find namedpipe functions in Kernel32Java JNA 在 Kernel32 中找不到命名管道函数
【发布时间】:2016-06-14 13:08:54
【问题描述】:

所以我有这个“Beep”函数可以工作,但是当我尝试任何 namedpipe 函数时它会返回:

线程“主”java.lang.UnsatisfiedLinkError 中的异常:错误 查找函数“WaitNamedPipe”:指定的过程无法 找到了。

import java.nio.charset.StandardCharsets;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;



/**
 * @author  
 *
 */
public class NamedPipeNativeFunctions {

    /*
     * Public Declare Function CallNamedPipe Lib "kernel32" Alias
     * "CallNamedPipeA" (ByVal lpNamedPipeName As String, lpInBuffer As Any,
     * ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As
     * Long, lpBytesRead As Long, ByVal nTimeOut As Long) As Long
     * 
     */
    public interface Kernel32 extends Library {
public long CallNamedPipe (String lpNamedPipeName,long  lpInBuffer ,long nInBufferSize, Pointer  lpOutBuffer,long nOutBufferSize, Pointer lpBytesRead, long  nTimeOut);
public boolean WaitNamedPipe(String lpNamedPipeName,
        int nTimeOut);
public boolean Beep(int FREQUENCY, int DURATION);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        myClass myclass = new myClass () ; 
        myClass myclass2 = new myClass () ; 

        Pointer lpOutBuffer =  myclass.getPointer() ; 
        Pointer lpBytesRead  =myclass2.getPointer()  ; 

        Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
        //lib.CallNamedPipe("1234TestPipe", 255, 255, lpOutBuffer , 255, lpBytesRead , 5000); 
        lib.Beep(698, 500); // works 
         boolean sucess =   lib.WaitNamedPipe("hgf" ,(int) 5000 ); // does not work 

    }

}

【问题讨论】:

  • WaitNamedPipe 是一个 #define 并且是 WaitNamedPipeAWaitNamedPipeW 取决于调用者分别使用的是 ANSII 还是 UNICODE。来源(参见 Unicode 和 ANSI 名称部分):msdn.microsoft.com/en-us/library/windows/desktop/…
  • 为什么标记为 C++?我在这里看不到任何关系。
  • @RichardCritten:你的评论解决了我的问题,你想把它转换成答案,以便我可以奖励给你吗?
  • 您很可能不应该在接口映射中使用long,除非您确定本机调用需要 64 位值。 NativeLong 存在以映射到本机 long

标签: java jna kernel32


【解决方案1】:

WaitNamedPipe 是一个#define 并且是WaitNamedPipeAWaitNamedPipeW,具体取决于调用者是分别使用ANSII 还是UNICODE。来源(参见 Unicode 和 ANSI 名称部分):https://msdn.microsoft.com/en-us/library/windows/desktop/aa365800(v=vs.85).aspx

【讨论】:

猜你喜欢
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多