0

InvokeScript() メソッドは null を返します。

JavaScript:

function gpsToAddress(gpsX, gpsY) {
    var coords = new daum.maps.LatLng(gpsX, gpsY);
    geocoder.coord2detailaddr(coords, CallbackA)}

    function CallbackA(status, result) {
    if(status===daum.maps.services.Status.OK)
    {
        return result[0].jibunaddress;
    }
}

およびC#:

private void f_ret_gpstoaddress(double v_gps_x, double v_gps_y,out string v_address)
{
    object[] args = { "gpsToAddress(" + v_gps_x + "," + v_gps_y + ");" };
    v_address = (string)webBrowser1.Document.InvokeScript("eval", args);
    return;
}

private void button3_Click(object sender, EventArgs e)
{
    f_ret_gpstoaddress(37.353933, 127.944739, out v_address);
    MessageBox.Show(v_address);
}

「args」と「v_address」は null を返し、messageBox も null を返します。いくつかの値を返したい。私を助けてください!

編集: OK、C# コードを次のように編集しました。

private string f_ret_gpstoaddress(double v_gps_x, double v_gps_y, out string v_address)
        {
            var args =  "gpsToAddress(" + v_gps_x + "," + v_gps_y + ");" ;
            v_address = webBrowser1.Document.InvokeScript("eval",new object[] { args }).ToString();
            return v_address;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            f_ret_gpstoaddress(37.353933, 127.944739, out v_address);
            MessageBox.Show(v_address);
        }

したがって、args は null ではありませんが、v_address はまだ null です。なにが問題??

4

1 に答える 1

1

関数 gpsToAddress は何も返しません。ただし、プロセスが終了するとコールバック関数が呼び出されます。

関数を呼び出すときにコールバック関数を渡すことをお勧めします。

詳細については、このスレッドを参照してください: Make async event synchronous in JavaScript

編集:上記の質問に基づいて:

コールバック クラスを作成する

[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Callback
{
   // allows an instance of Callback to look like a function to the script
   // (allows callback() rather than forcing the script to do callback.callMe)
   [System.Runtime.InteropServices.DispId(0)]
   public void callMe(string v_address)
   {
      MessageBox.Show(v_address);
   }
 }

コールバックを使用して js 関数を呼び出します。

private string f_ret_gpstoaddress(double v_gps_x, double v_gps_y, out string v_address)
{
    Callback cb = new Callback();
    var args =  "gpsToAddress(" + v_gps_x + "," + v_gps_y + "," + cb);" ;
    v_address = webBrowser1.Document.InvokeScript("eval",new object[] { args }).ToString();
    return v_address;
}

js 関数はコールバックを引数として取ります:

function gpsToAddress(gpsX, gpsY, callback) {
   function CallbackA(status, result) {
      if(status===daum.maps.services.Status.OK)
      {
         callback(result[0].jibunaddress);
      }
      else {
         callback('');
      }
   }

   var coords = new daum.maps.LatLng(gpsX, gpsY);
   geocoder.coord2detailaddr(coords, CallbackA)
}

編集2:(ダミーサンプル)

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
       string javascript = @"<html><head><script type='text/javascript'>function gpsToAddress(param1, callback) {
    function CallbackA()
    {
        callback(param1);
    }

    setTimeout(function() { CallbackA() }, 1000);
 }</script></head></html>";
    public Form1()
    {
        InitializeComponent();
        webBrowser1.DocumentText = javascript;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Callback cb = new Callback();
        webBrowser1.Document.InvokeScript("gpsToAddress", new object[] { 123, cb });
    }
}

[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class Callback
{
    // allows an instance of Callback to look like a function to the script
    // (allows callback() rather than forcing the script to do callback.callMe)
    [System.Runtime.InteropServices.DispId(0)]
    public void callMe(string v_address)
    {
        MessageBox.Show(v_address);
    }
}
}
于 2016-08-01T06:40:38.113 に答える