1

The InvokeScript() Method returns 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;
    }
}

and 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);
}

the 'args' and 'v_address' returns null and the messageBox returns null, too. I want to return some values. Please, help me!

EDIT : OK, I edited the C# code like this:

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);
        }

So, args is not null, but v_address is still null. What's problem??

Mt.Nine
  • 11
  • 5

1 Answers1

2

Your function gpsToAddress doesn't return anything. But it called a callback function when process is finished.

I suggest to you to pass the callback function when you called the function.

Please look this thread for more details : Make async event synchronous in JavaScript

Edit: Based on the above question :

Create a callback class

[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);
   }
 }

Call js function with a callback :

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;
}

The js function take a callback as argument :

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)
}

Edit 2 : (dummy sample)

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);
    }
}
}
Community
  • 1
  • 1
Silvinus
  • 1,445
  • 8
  • 16