2016-07-29 12 views
0

InvokeScript()メソッドはnullを返します。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); 
} 

'引数' と 'v_addressは' nullを返し、メッセージボックスには、あまりにも、nullを返します。 いくつかの値を返す必要があります。 お願いします!

EDITは: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); 
     } 

ので、引数がnullではありませんが、v_addressはまだnullです。何が問題なの?

+0

任意のソリューションは? –

答えて

0

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関数はコールバック引数としてkは

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

あなたの答えをありがとう。しかし、私は理解していません。もっと説明できますか? –

+0

OK、わかった。しかし、 'WindowsFormsApplication6.Callback'が返されます。したがって、 'WindowsFormsApplication6が定義されていません'例外がスローされます。 –

+0

コードにエラーがあります。私は新しい編集でダミーのサンプルを入れました – Silvinus

関連する問題