2016-07-23 13 views
0

私は、外部プログラムを実行する静的メソッドを含むクラスがあります。これは、JNA(Java NAtive Access)のCreateProcess APIを使用しています。エラー:静的クラス強制UnsupportedOperationException

PS:私はこのコードに基づいて作成しています。hereはSOです。

 @Override 
     protected List getFieldOrder() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

そして、私のプロジェクトを実行するために、私は成功を持っていることはありません:

私の悩みはProcessInformationクラスと上記の方法で使用するこのためStartupInfoAとして静的クラスを入れたときに、このタイプの@Override強制することです - 。(参照:

enter image description here

だから、私はあなたに尋ねる: - それのためにいくつかの解決策は存在し

?ここ

は私が私の目標を得るためのすべてのプロセスを作ってるんだかです:

package myProgram; 

import com.sun.jna.Native; 
import com.sun.jna.Pointer; 
import com.sun.jna.Structure; 
import com.sun.jna.WString; 
import static com.sun.jna.platform.win32.WinBase.STARTF_USESHOWWINDOW; 
import static com.sun.jna.platform.win32.WinUser.SW_SHOWNORMAL; 
import com.sun.jna.win32.StdCallLibrary; 
import java.util.List; 


public class Execute { 

    public interface Kernel32 extends StdCallLibrary { 
    Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class); 

    boolean CreateProcessA(
      String lpApplicationName 
      , String lpCommandLine 
      , Structure lpProcessAttributes 
      , Structure lpThreadAttributes 
      , boolean bInheritHandles 
      , int dwCreationFlags 
      , Structure lpEnvironment 
      , String lpCurrentDirectory 
      , Structure lpStartupInfo 
      , Structure lpProcessInformation); 
} 

public static class ProcessInformation extends Structure { 
    public Pointer hProcess; 
    public Pointer hThread; 
    public int dwProcessId; 
    public int dwThreadId; 

     @Override 
     protected List getFieldOrder() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 
    } 

public static class StartupInfoA extends Structure { 
    public int cb; 
    public WString lpReserved; 
    public WString lpDesktop; 
    public WString lpTitle; 
    public int dwX; 
    public int dwY; 
    public int dwXSize; 
    public int dwYSize; 
    public int dwXCountChars; 
    public int dwYCountChars; 
    public int dwFillAttribute; 
    public int dwFlags; 
    public short wShowWindow; 
    public short cbReserved2; 
    public Pointer lpReserved2; 
    public Pointer hStdInput; 
    public Pointer hStdOutput; 
    public Pointer hStdError; 

     @Override 
     protected List getFieldOrder() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 
    } 

public static void ExecuteProc(String software){ 

     ProcessInformation processInformation = new ProcessInformation(); 
     StartupInfoA startupInfo = new StartupInfoA(); 
     startupInfo.dwFlags = STARTF_USESHOWWINDOW; 
     startupInfo.wShowWindow = SW_SHOWNORMAL; 

     Kernel32.INSTANCE.CreateProcessA(software, null 
       , null 
       , null 
       , true 
       , 0 
       , null 
       , null 
       , startupInfo 
       , processInformation); 
    } 

} 
+1

'ProcessInformation'で' Unrowed new UnsupportedOperationException'文を削除し、それを 'return Arrays.asList(new String [] {" hProcess "、" hThread "、" dwProcessId "、" dwThreadId "})に置き換えることはできますか?それは何か違いがあるかどうかを確認しますか? – CKing

+0

@CKing、この提案は、他のエラー例外[参照](http://pastebin.com/zsQb93uP)を返します。 –

+1

さて、私はあなたに 'ProcessInformation'クラスにその行を貼り付けるよう依頼しました。 'StartupInfoA'に同じ行を貼り付けるべきではありません。なぜなら、それは異なるフィールドセットを持っているからです。 'getFieldOrder'メソッドは、クラスに現れるフィールドの名前を表示された順序で返さなければなりません。だから 'StartupInfoA'では、' StartupInfoA'にあるフィールドの名前を返す必要があります!それは理にかなっていますか? – CKing

答えて

1

getFieldOrder方法の目的は、フィールドがStructureを表すクラスに表示される名前と順序を提供することです。あなたは次のことを実行する必要があります。

ProcessInformation

次のようにgetFieldOrder方法を置き換えます

StartupInfoAための同様
@Override 
    protected List getFieldOrder() { 
     return Arrays.asList(new String[] { "hProcess", "hThread", "dwProcessId", "dwThreadId" }); 
    } 

、順番にStartupInfoA内のフィールドの名前を含むリストを返しますそれらが現れる。

関連する問題