Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8899

C++アプリケーションとC#アプリケーションで値をやり取りしてみる

$
0
0

やりたいこと

異なる言語アプリケーション(今回の場合C++とC#)で値をやり取りしてみます。
txtを生成し、読み書きしてしまえばやり取り自体は可能ですが、速度やリソースの問題もあり、あまりスマートなやり方ではありません。
今回は、共有メモリを使用してやり取りしてみます。

必要なもの

usingSystem.IO.MemoryMappedFiles;
#include <Windows.h>

C#側のソースコード

Program.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.IO.MemoryMappedFiles;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceShareMemoryTest{classProgram{privatestaticreadonlystringsmName="MyShareMemory1";staticvoidMain(string[]args){Console.Title="C#で共有メモリを読み取るアプリケーション";intvalue=RSM(smName);if(value!=-1){Console.WriteLine("共有メモリの値は "+value+" でした。");}else{Console.WriteLine("共有メモリが存在しませんでした。");}Console.ReadKey();}/// <summary>/// 共有メモリに書き込みます。/// 存在しなかった場合新しく作成します。/// </summary>privatestaticvoidWSM(stringsmName,intvalue){MemoryMappedFileshare_mem=null;MemoryMappedViewAccessoraccessor=null;try{share_mem=MemoryMappedFile.CreateOrOpen(smName,1024);accessor=share_mem.CreateViewAccessor();accessor.Write(0,value);}catch(Exceptionex){Console.WriteLine(ex.Message);}finally{if(accessor!=null)accessor.Dispose();if(share_mem!=null)share_mem.Dispose();}}/// <summary>/// 共有メモリから値を読み取ります。/// 存在しなかった場合-1を返します。/// </summary>privatestaticintRSM(stringsmName){MemoryMappedFileshare_mem=null;MemoryMappedViewAccessoraccessor=null;try{share_mem=MemoryMappedFile.OpenExisting(smName);accessor=share_mem.CreateViewAccessor();intdata=accessor.ReadInt32(0);returndata;}catch(Exceptionex){Console.WriteLine(ex.Message);return-1;}finally{if(accessor!=null)accessor.Dispose();if(share_mem!=null)share_mem.Dispose();}}}}

C++側のソースコード

ShareMemoryTestCpp.cpp
#include <iostream>
#include <Windows.h>
intmain(){SetConsoleTitleA("C++で共有メモリに書き込むアプリケーション");constautosmName=L"MyShareMemory1";constautosize=1024;HANDLEhShareMemory=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size,smName);if(hShareMemory==NULL){std::cout<<"CreateFileMappingに失敗\n";std::exit(1);}else{automyValue=(int*)MapViewOfFile(hShareMemory,FILE_MAP_ALL_ACCESS,NULL,NULL,size);*myValue=634;std::cout<<"ESCを押して終了します。\n";while(TRUE){if(GetAsyncKeyState(VK_ESCAPE)){break;}Sleep(50);}//後片付けUnmapViewOfFile(myValue);}//後片付けCloseHandle(hShareMemory);system("pause");}

結果

624f960b5607e0524cdb21f06478d099.png

最後に

以上、今回は共有メモリを使用してC++とC#間で値のやり取りをしてみました。


Viewing all articles
Browse latest Browse all 8899

Trending Articles