rundll32 url.dll,FileProtocolHandler

Я использую rundll32 url.dll,FileProtocolHandler my_file.dotx открыть файлы под виндой.

Он отлично работает с документами.docx, но когда я пробую его с документами.dotx (шаблонные документы), он создает новый.docx на основе шаблона.

Как и в обычном поведении в проводнике Windows: когда вы дважды щелкаете файл шаблона.dotx, он создает на его основе новый файл.docx. Если вы хотите открыть настоящий файл.dotx, вы должны щелкнуть по нему правой кнопкой мыши и выбрать "открыть" вместо "новый".

Вопрос в том, как сделать то же самое с rundll32? Есть ли в команде опция принудительного открытия базового шаблона вместо создания нового документа?

Редактировать: мне нужен способ сделать это без функций C, просто текст в командной строке (я использую Java для этого).

1 ответ

Решение

Может быть, вы можете обернуть простую C-программу вокруг ShellExecute, передавая глагол OPEN.

ShellExecute(NULL, TEXT("open"), 
TEXT("rundll32.exe"), TEXT("url.dll,FileProtocolHandler pathToGadget"), 
NULL, SW_SHOWNORMAL);   

Я нашел этот пример здесь.

редактировать:

Так как вы делаете это в Java - вы можете попробовать JNI-упаковку функции ShellExceute, как это (из примера, который я нашел на Wannabe Java Rockstar и забил)

 public static boolean execute(String file, String parameters) {
    Function shellExecute =
      Shell32.getInstance().getFunction(SHELL_EXECUTE.toString());
    Int32 ret = new Int32();
    shellExecute.invoke(ret, // return value
                        new Parameter[] {
                          new Handle(),         // hWnd
                          new Str("open"),      // lpOperation
                          new Str(file),        // lpFile
                          new Str(parameters),  // lpParameters
                          new Str(),            // lpDirectory
                          new Int32(1)          // nShowCmd
                        });
    if(ret.getValue() <= 32) {
        System.err.println("could not execute ShellExecute: " +
                           file + ". Return: " + ret.getValue());
    }
    return (ret.getValue() > 32);
  }

  public static void main(String[] args) {
    ShellExecute.execute("rundll32.exe","url.dll,FileProtocolHandler pathToGadget" );
  }
Другие вопросы по тегам