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