1

目的

JavaScriptでエスケープせずにJavaScript経由で.NETCOMコンポーネントにファイルパスを送信したい。


環境

  • Windows 7 x64
  • .NET 4.0

私たちは何を知っていますか?

  • 次のようなパスを通過するC:\tempと、次のようになります...

ここに画像の説明を入力してください

  • 次のようにUNCパスを渡すと\\Server\Directory、次のようになります...

ここに画像の説明を入力してください

  • C:\\tempパス(または)をエスケープすると、\\\\Server\\Directory受信した値は正しいです。

私は何を試しましたか?

  • @プライベートフィールドに格納するときに、変数名の前にinを使用してみました。
  • 私は自分のGoogleFuで同じことをしている人を見つけようとしましたが、しませんでした。

コード

COMコンポーネント

[Guid("30307EE0-82D9-4917-B07C-D3AB185FEF13")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface ILauncher
{
    [DispId(1)]
    void setDirectory(string location);

    [DispId(2)]
    void launch(string args, bool debug = false);
}

[Guid("F91A7E9F-2397-4DEC-BDAD-EBFC65CFCCB2")]
[ProgId("MyActiveXControl.MyControl")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(ILauncher))]
[ComVisible(true)]
public class Launcher : ILauncher
{
    private string _location;

    public void setDirectory(string location)
    {
        _location = location;
    }

    public void launch(string args, bool debug = false)
    {
        var programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86);
        if (string.IsNullOrEmpty(programFiles))
        {
            programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
        }

        var exe = string.Format(@"{0}\MyApp\MyApp.exe", programFiles);
        if (debug)
        {
            MessageBox.Show(exe, "Target Path", MessageBoxButtons.OK, MessageBoxIcon.Information);
            MessageBox.Show(_location, "Drop Location", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        var startInfo = new ProcessStartInfo(exe, string.Format("\"{0}\" \"{1}\"", args, _location));
        startInfo.WorkingDirectory = Path.GetDirectoryName(exe);
        startInfo.CreateNoWindow = false;

        try
        {
            var p = Process.Start(startInfo);
            if (p == null)
            {
                MessageBox.Show("The app could not be started, please try again.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

JavaScript

<html>
    <body>
        <input type="button" value="Launch Control" onclick="launchControl();" />

        <script>
            function launchControl() {
                o = new ActiveXObject("MyActiveXControl.MyControl");
                o.setDirectory("C:\\temp");
                o.launch("test_args", true);
            }
        </script>
    </body>
</html>
4

1 に答える 1

0

結局、JavaScriptを変更する必要があるのは、後で変更できないためです。それが私たちに届くまでに、バックスラッシュを追加する必要がありますが、あるディレクトリがどこで始まり、別のディレクトリがどこで終わったかがわからないため、実際には追加できません。

JavaScriptを変更するだけです。

ですから、私たちはその力で働き、すべてが順調です。

于 2013-01-10T15:52:21.223 に答える