• ベストアンサー

VB.NET SendMessage通信

AKARI0418の回答

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

別プロセスとの通信をさしていますよね? そうであれば、Windows RemortiongのIPC通信(名前付きパイプともいうみたいです。)を使用してみるというのはどうですか? SendMessageは文字列を送ることを想定しています、Cなどを扱った経験がおありですとイメージができると思いますが、文字列の終了はNullです。 そのためある文字列の、ポインタの指し示す範囲は指定アドレスから、Nullの前までとなります。 SendMessageは文字列を送るわけですから、ポインタの指し示す範囲は指定アドレスから、Nullの前までしか送信しないか、長さが異なるためエラーが出るかするのではないかと思います。 同じプロセス内のスレッド間であれば、大域変数を使用してアクセスすることができますので、別段通信手段を用意する必要はありません。 ただ、きちんと排他をかけることや、列挙体であれば、 Dim mySyncdQ As Queue = Queue.Synchronized(new Queue ) のようにSynchronizedを継承しているクラスを使用するようにすればよいでしょう。

mlc56724
質問者

お礼

他にも方法あるんですね。当たり前ですが。 自分の勉強不足を感じています。 ありがとうございました。

関連するQ&A

  • VB.NETによるTCP通信プログラムについて

    VB.NETによるTCP通信プログラムについて VB.NETによりTCP通信プログラムを開発しようと思っておりますが、TCP通信はクライアントとサーバーに機能が分かれると思いますが、一つのアプリケーションでサーバー機能とクライアント機能を有するアプリケーションは開発が可能でしょうか? サンプルプログラムを探しているのですが、どれも、クライアントとサーバーのどちらかの機能だけですが、両機能を持ち合わせたサンプルを掲載されているサイトをご存じの方は、お手数ですが、教えて頂けると助かります。 ご教授のほど、よろしくお願い致します。 Windows XP SP3 Visual Studio 2008 Visual Basic

  • SendMessageについて

    VERSION:VB6.0 SendMessageを使用しSQLPlusに対して文字列を送りたいのですが巧くいきません。 ↓が自身が作成したSendMessageを使用しているプログラムの一部なのですが、おかしな点や別な方法があればご教授お願いします。 '別アプリにメッセージを送る Declare Function SendMessageStr Lib "user32.dll" _ Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, _ ByVal wParam As Long, ByVal lParam As String) As Long Dim pId As Long 'プロセスID pId = Shell("SQLPlusのアドレス" & " /nolog", 1) SendMessageStr pId, WM_SETTEXT, 0, "送信する文字列" というプログラムです。 SQLPlusは起動するのですが文字列がSQLPlus側に送れず困っています。 どうかよろしくお願いします。

  • バイト配列の構造体変換について

    TCPの通信アプリケーションをて作成しています。 Recvbuff(1024) as byte と定義した変数に受信したデータを格納し以下のような構造体に格納 したいのです。 構造体A id as integer Usercode as string Username as string Filename as string このとき、共用体のような使いかたはVBではできないようなので すが、このような場合 整数なら「Recvbuff(1) * 256 + Recvbuff(0)」のように計算する。  文字列なら必要な文字のみ切り取ってGetStringで変換する。 といった方法しかないのでしょうか。 環境は VS2008 VB.NET です。

  • VBの「As String * 128」とは?

    VBの「As String * 128」とは? Visual Basic 2010 Expressでコンソールアプリケーションを作成しています。 OSのヴァージョンを取得する機能を作成したかったので、 http://hanatyan.sakura.ne.jp/vbhlp/Version.htm を参考にして、OSVERSIONINFOの構造体を定義しました。 しかし szCSDVersion As String * 128 の 「* 128」 の部分で、ステートメントの終わりを指定してくださいとエラーが出ます。 「* 128」とは、いったいどういう意味ですか? また、エラーを無くす方法はありますか? いろいろ検索しましたが、調べ方が悪いのか、分かりませんでした。 よろしくお願いします。

  • VB2005でデリゲートというものを始めて使っています

    VB2005でデリゲートというものを始めて使っています。 いま困っているのは、メインスレッドのテキストコントロールのTextプロパティに、別のスレッドからデータをセットする場合、デリゲートという機能を使わないといけないということで、以下のようにしています。 画面上には別スレッドで書きこみたいTextBoxコントロールが沢山あり、 個々に(1)を記述しないといけないのでしょうか? txtTest部分の名前が違うだけですが・・・ デリゲードに関して初めて使っているのであまり理解できていませんが、数が多いと 面倒なので何か方法があるのではないか、質問しました。 詳しい方教えて下さい。 そもそも、別スレッドの書き込みでデリゲートを使う方法は駄目なのでしょうか? 'デリゲートの定義 Delegate Sub dlgWriteText(ByVal text As String) 'txtTestに書き込む ----- (1)   セットするコントロール毎にこれが必要??? Private Sub DlSettxtUserName(ByVal text As String)   Me.txtTest.Text = Text End Sub '別スレッド部分 dim data as String = "別スレッドでデータセット" '別スレッドで書きこむ Me.txtTest.BeginInvoke(New dlgWriteText(AddressOf dSetTest), data) よろしくお願いします。

  • VB.Netでのシリアル通信についての質問

    VB6.0でバイト型変換を行ってからバッファに送信する プログラムを使用しているのですが、これを.Netにて 同様に行う記述方法が分りません。お分かりになる方 よろしくお願い致します。抜粋しておりますのでヘンテコ なソースかとは思いますがよろしくお願い致します。主にChrBが使用出来なくなった事が困っております。 (VB6.0と同様にAxMSCommを使用しております。) Private Sub Rs232c_Com() Dim bytOutByte() As Byte Dim strCmdData as String   strCmdData="83" 'コマンド送信 bytOutByte() = ChrB(Val("&h" & strCmdData)) MSComm1.Output = bytOutByte() End Sub

  • excelVBAからC#へsendmessage

    excelのVBAから文字列をsendmessageで C#のプログラムに文字列を渡せないかと考えています。 ネットで調べつつなんとか作ってみたのですが、 どうしてもうまく動作しません。 変な文字列が表示されてしまいます。 どこがおかしいか教えて頂けないでしょうか。 windows7、Excel2010、.netFramework4になります。 ※※※excel VBA側プログラム※※※※※※※※※※※※ //外部functionを使いますよ Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _ (ByVal hwd As Long, ByVal Msg As Long, ByVal wpara As Long, lpara As COPYDATASTRUCT) As Long //構造体 Public Type COPYDATASTRUCT dwData As Long cbData As Long lpData As String End Type //メッセージを送信するsub Public Sub sousin() Dim result As Longv Dim hWnd As Long Dim cds As COPYDATASTRUCT Dim str As String Dim strby() As Byte Dim length As Long  ~ ウィンドウハンドルの取得 ~ str = "test" strby = StrConv(str, vbFromUnicode) length = UBound(strby) - LBound(strby) + 1 cds.dwData = 0 cds.lpData = str cds.cbData = length result = SendMessage(hWnd, WM_COPYDATA, 0, cds) End Sub ※※※C#側プログラム※※※※※※※※※※※※※※※ //構造体 public struct COPYDATASTRUCT { public long dwData; public long cbData; public string lpData; } //WndProc関数 protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_COPYDATA: COPYDATASTRUCT mystr = new COPYDATASTRUCT(); Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype); label1.Text = mystr.lpData;           ←※無茶苦茶な文字列になります break; } base.WndProc(ref m); }

  • TCP/IP通信について

    現在、以下のようにTCP/IP通信のプログラミングを行っており、 サーバ/クライアント別々に4byteのデータ送信を10msec毎に10秒間行っております。 現在、WimdowsVista-Windows7間で各々をサーバ/クライアントとして順に起動し、 相互に4byte送信しているハズが、倍の8byteや12byteとデータが連なって送信されている 事象が発生してます。 OutputStreamではwrite後にflushを行っているので、flush契機でメモリ上に蓄えられた 送信用バッファが送信されるイメージでおりますが、4byteで送信できていないように見えます。 上記について、解決方法をご存じであればご教授お願い致します。   <Server.java> ===== public class Server {  public static ServerSocket ss = null;  public static Socket soc = null;  private static InputStream is = null;  private static OutputStream os = null;  public static void main(String[] args) {      try {    // サーバソケット生成    ss = new ServerSocket(5000);    soc = ss.accept();    is = soc.getInputStream();    os = soc.getOutputStream();    Thread rcvTh = new ServerRcvThread(is);    rcvTh.start();    Thread sndTh = new ServerSndThread(os);    sndTh.start();    // 10秒スリープ    try{     Thread.sleep(10000);    } catch ( Exception e){     e.printStackTrace();    }    // スレッド停止    rcvTh.stop();    sndTh.stop();   } catch (IOException e) {    e.printStackTrace();   } finally{    try {     is.close();     os.close();     soc.close();     ss.close();    } catch (IOException e) {     e.printStackTrace();    }      }  } } class ServerSndThread extends Thread{  private static OutputStream ous = null;  ServerSndThread( OutputStream os ){   this.ous = os;  }  public void run(){   byte sndData[] = new byte[4];   sndData[0] = 0x01;   sndData[1] = 0x02;   sndData[2] = 0x03;   sndData[3] = 0x04;   try {    while(true){     // データ書込み     ous.write(sndData);     ous.flush();     System.out.println("データ送信");     // 0.01秒スリープ     try{      Thread.sleep(10);     } catch ( Exception e){      e.printStackTrace();     }    }   } catch (IOException e) {    e.printStackTrace();   }  } } class ServerRcvThread extends Thread{  private static InputStream ins = null;  ServerRcvThread( InputStream os ){   this.ins = os;  }    public void run(){   byte rcvData[] = new byte[16];   int size = 0;   try {    while(true){     // データ読込み     size = ins.read(rcvData);     System.out.println("size:"+size+"byte");    }   } catch (IOException e) {    e.printStackTrace();   }  } } =====     <Client.java> ===== public class Client {  private static Socket soc = null;  private static OutputStream os = null;  private static InputStream is = null;  public static void main(String[] args) {   try {    // ソケット生成    soc = new Socket("192.168.3.3", 5000);    is = soc.getInputStream();    os = soc.getOutputStream();    Thread rcvTh = new ClientRcvThread(is);    rcvTh.start();    Thread sndTh = new ClientSndThread(os);    sndTh.start();    // 10秒スリープ    try{     Thread.sleep(10000);    } catch ( Exception e){     e.printStackTrace();    }    // スレッド停止    rcvTh.stop();    sndTh.stop();   } catch (IOException e) {    e.printStackTrace();   } finally{    try {     is.close();     os.close();     soc.close();    } catch (IOException e) {     e.printStackTrace();    }      }     } } class ClientSndThread extends Thread{  private static OutputStream ous = null;  ClientSndThread( OutputStream os ){   this.ous = os;  }    public void run(){   byte sndData[] = new byte[4];   sndData[0] = 0x04;   sndData[1] = 0x03;   sndData[2] = 0x02;   sndData[3] = 0x01;   try {    while(true){     // データ書込み     ous.write(sndData);     ous.flush();     System.out.println("データ送信");     // 0.01秒スリープ     try{      Thread.sleep(10);     } catch ( Exception e){      e.printStackTrace();     }    }   } catch (IOException e) {    e.printStackTrace();   }  } } class ClientRcvThread extends Thread{  private static InputStream ins = null;  ClientRcvThread( InputStream os ){   this.ins = os;  }    public void run(){   byte rcvData[] = new byte[16];   int size = 0;   try {    while(true){     // データ読込み     size = ins.read(rcvData);     System.out.println("size:"+size+"byte");    }   } catch (IOException e) {    e.printStackTrace();   }  } } =====

    • ベストアンサー
    • Java
  • 【初心者です】VB.NETとASP.NET、何が違う?

    今までASPでWeb開発を行っていた者です。 最近顧客の方で「Microsoft Visual Basic .NET Standard Version 2003」を 購入したらしく、これからはVB.NETでWeb開発することとなりそうです。 そこで、.NETについて疑問点があります。 (1)VB.NETで、Web画面の開発って可能なのでしょうか?  私は過去にVB6.0で開発を行ったことがあったのですが、  VB6.0ではWindowsのアプリケーションを作成するための開発ソフト  だと思っていたのですが、VB.NETからはWindowsのアプリケーションだけでなく、  Web画面も開発可能になったということでしょうか? (2)「Visual Studio .NET 2003」の内容は、、、   ・ Visual Basic .NET 2003   ・ Visual C# .NET 2003   ・ Visual C++ .NET 2003   ・ Visual J# .NET 2003  になってますが、何故ASP.NETが入ってないのでしょうか?  (そもそも、ASP.NETの開発ツールは無いのでしょうか?) 考えれば、考えるほどわからなくなりそうです。 どうぞ、宜しくお願い致します。

  • VBで16進数をバイナリ変換しRS232通信

    VB CommunityでRS232C通信プログラムを作成しています。 OKWaveをみて、ポート接続などはできたのですが、 データ送信でつまづいてます。 16進数をバイナリ変換し送信したいのです。 その部分ですが、16進数で[11]をバイナリに変換して送信したい場合、 Dim command(0) As Byte command(0) = &H11 SerialPort1.Write(command, 0, 1) としても、16進数で[11]を送ったときの動作を行いません。。 VectorなどでのRS232通信テストツールでは反応あるのですが。。 初歩的ですみませんが、よろしくお願いします。