トップ | puarts.com
メモ  |  制作記  |  開発記  |  日常の記録  |  デジタルコンテンツ制作  |  ファイアーエムブレム  |  ゲーム  |  C/C++  |  C#  |  PC/ソフトウェア  |  Web 開発  |  スクリプト言語  |  その他プログラミング  |  
「サンプル」に関連する記事一覧

0  

名前付きパイプのプロセス間通信をサーバー側 C#、クライアント側 C++ で書く

2016/09/27

C++ 名前付きパイプによるプロセス間通信の小さいサンプルの記事で載せた C++ のIPCサンプルで、サーバー側を C# にしたくなったので、C# に置き換えました。挙動は全く同じです。

ソースコードを載せておきます。

サーバー側の C# コード


using System.IO;
using System.IO.Pipes;

namespace PicSample
{
    class Program
    {
        static void Main(string[] args)
        {
            var server = new NamedPipeServerStream("mynamedpipe");
            System.Console.WriteLine("クライアント起動待ち..");
            server.WaitForConnection();
            StreamWriter streamWriter = new StreamWriter(server);
            string sendMessage = string.Empty;
            do
            {
                System.Console.Write("送信する文字を入力(Endで終了): ");
                sendMessage = System.Console.ReadLine();
                streamWriter.Write(sendMessage);
                streamWriter.Flush();
                server.WaitForPipeDrain();
            } while (sendMessage != "End");

            server.Dispose();
        }
    }
}

クライアント側の C++ コード


#include <Windows.h>
#include <iostream>

void main()
{
    HANDLE pipeHandle = CreateFile(L"\\\\.\\pipe\\mynamedpipe", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (pipeHandle == INVALID_HANDLE_VALUE)
    {
        std::cout << "パイプ作成に失敗" << std::endl;
        return;
    }

    std::cout << "サーバーから受信開始" << std::endl;

    // 文字列受信
    char recvBuffer[256];    //受信バッファ
    do
    {
        recvBuffer[0] = '\0';
        DWORD recvBuffer;
        ReadFile(pipeHandle, recvBuffer, sizeof(recvBuffer), &recvBuffer, NULL);
        if (recvBuffer[0] == '\0')
        {
            continue;
        }
        recvBuffer[readBytes] = '\0';
        std::cout << "受信: " << recvBuffer << std::endl;
    } while (strcmp(recvBuffer, "End") != 0);

    CloseHandle(pipeHandle);
}

C++ 名前付きパイプによるプロセス間通信の小さいサンプル

2016/09/26

以前作った GL のアプリケーションをプロセス間通信で外から操作できるようにしたくなったので、第1歩として名前付きパイプを使ったプロセス間通信の Windows 版小 C++ サンプルを作りましたので載せておきます。

サーバー側のプロセス起動後にクライアント側を起動し、サーバー側で文字列を入力すると、クライアント側に出力されるというサンプルです。

サーバー側のコード


#include <Windows.h>
#include <iostream>

void main()
{
    char sendBuffer[256];
    HANDLE pipeHandle = CreateNamedPipe(
        L"\\\\.\\pipe\\mynamedpipe",
        PIPE_ACCESS_OUTBOUND, PIPE_TYPE_MESSAGE,
        1,
        sizeof(sendBuffer),
        sizeof(sendBuffer),
        1000, NULL);
    if (pipeHandle == INVALID_HANDLE_VALUE)
    {
        std::cout << "パイプ作成に失敗" << std::endl;
        return;
    }

    std::cout << "クライアント起動待ち.." << std::endl;
    ConnectNamedPipe(pipeHandle, NULL);

    sendBuffer[0] = '\0';
    do
    {
        std::cout << "送信する文字を入力(Endで終了): ";
        // 入力文字列を送信
        std::cin >> sendBuffer;
        DWORD dwResult;
        WriteFile(pipeHandle, sendBuffer, strlen(sendBuffer) + 1, &dwResult, NULL);
    } while (strcmp(sendBuffer, "End") != 0);

    CloseHandle(pipeHandle);
}

クライアント側のコード


#include <Windows.h>
#include <iostream>

void main()
{
    HANDLE pipeHandle = CreateFile(L"\\\\.\\pipe\\mynamedpipe", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (pipeHandle == INVALID_HANDLE_VALUE)
    {
        std::cout << "パイプ作成に失敗" << std::endl;
        return;
    }

    std::cout << "サーバーから受信開始" << std::endl;

    // 文字列受信
    char recvBuffer[256];    //受信バッファ
    do
    {
        recvBuffer[0] = '\0';
        DWORD recvBuffer;
        ReadFile(pipeHandle, recvBuffer, sizeof(recvBuffer), &recvBuffer, NULL);
        if (recvBuffer[0] == '\0')
        {
            continue;
        }
        recvBuffer[readBytes] = '\0';
        std::cout << "受信: " << recvBuffer << std::endl;
    } while (strcmp(recvBuffer, "End") != 0);

    CloseHandle(pipeHandle);
}

参考
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365592(v=vs.85).aspx

C# WPF 任意の座標にマウスポインタを移動してクリックイベントを発生させる

2014/05/18

C#で任意の座標にマウスポインタを移動し、クリックイベントを実行するWPFサンプルです。


MainWindow.xaml

<Window x:Class="MouseCommander.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="90" Width="250">
    <Window.Resources>
        <ResourceDictionary>
            <Style TargetType="Button">
                <Setter Property="Margin" Value="10 0 0 0"></Setter>
                <Setter Property="Width" Value="100"></Setter>
                <Setter Property="Height" Value="30"></Setter>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal" 
                    Margin="10"
                    Height="30" HorizontalAlignment="Right" VerticalAlignment="Bottom">
            <Button Name="startButton" Click="StartButton_Click" >開始</Button>
            <Button Name="stopButton" Click="StopButton_Click">終了</Button>
        </StackPanel>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace MouseCommander
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        private static extern void SetCursorPos(int X, int Y);

        [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)]
        private static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

        private const int MOUSEEVENTF_LEFTDOWN = 0x2;
        private const int MOUSEEVENTF_LEFTUP = 0x4;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            var stopButtonPosition = stopButton.PointToScreen(new Point(0, 0));
            SetCursorPos((int)stopButtonPosition.X + 1, (int)stopButtonPosition.Y + 1);
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);      
        }

        private void StopButton_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("終了");
        }
    }
}

C# WPF TextBoxで改行

2014/05/18

WPF TextBoxでテキストの改行は&#xa;コードで出来るようです。すぐにわからなかったのでメモしておきます。


<TextBox Text="Hello,&#xa;world!" 
         AcceptsReturn="True" />

C++ Windowsでスタックバックトレース

2013/08/10 18:22

C++で簡易Assert用のマクロを作っていて、スタックバックトレースしたくなったのですが、Windowsで簡単にコールスタックを出力する方法がないか探してみたところ、下記のリンク先に書いてある関数が短くていい感じだったので、リンクを貼っておきます。

http://stackoverflow.com/questions/5693192/win32-backtrace-from-c-code

こちらにもincludeなども含めてソースコード載せておきます。

Source Code:


#include <windows.h>
#include <imagehlp.h>

#pragma comment(lib, "imagehlp.lib")

void printStack( void )
{
     unsigned int   i;
     void         * stack[ 100 ];
     unsigned short frames;
     SYMBOL_INFO  * symbol;
     HANDLE         process;

     process = GetCurrentProcess();

     SymInitialize( process, NULL, TRUE );

     frames               = CaptureStackBackTrace( 0, 100, stack, NULL );
     symbol               = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
     symbol->MaxNameLen   = 255;
     symbol->SizeOfStruct = sizeof( SYMBOL_INFO );

     for( i = 0; i < frames; i++ )
     {
         SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );

         printf( "%i: %s - 0x%0X\n", frames - i - 1, symbol->Name, symbol->Address );
     }

     free( symbol );
}

C言語でDFT(離散フーリエ変換)のプログラムを作ってみる

C言語で DFT のプログラムを書いてみました。

0  

にほんブログ村 ゲームブログ ファイアーエムブレムへ にほんブログ村 デザインブログ コンピュータグラフィックスへ

0.0232 sec

Copyright(C)2006-2018 wsp All Rights Reserved