Advertisement
hiro1357

C++/CLIでWrapperライブラリを書きたい時用サンプル

Apr 5th, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.96 KB | None | 0 0
  1. // C++/CLIでWrapperライブラリを書きたい時用サンプル
  2.  
  3.  
  4. // wrapper.h
  5.  
  6. #pragma once
  7.  
  8. using namespace System;
  9.  
  10. namespace wrapper {
  11.  
  12.     public ref class Wrapper
  13.     {
  14.         // TODO: このクラスの、ユーザーのメソッドをここに追加してください。
  15.     public:
  16.         static int TestFunc(System::String ^%s, int n);//staticをつけることで、スタティックメソッドとして扱われる。
  17.     };
  18. }
  19.  
  20.  
  21. // wrapper.cpp
  22.  
  23. #include "stdafx.h"
  24.  
  25. #include "testlib.h"
  26. #include <string.h>
  27.  
  28. using namespace wrapper;
  29. using namespace System;
  30. using namespace System::Runtime::InteropServices;
  31.  
  32. extern "C" {
  33.  
  34.     int test_func(char *p, int n){
  35.         memset(p, 'a', n);
  36.         p[n] = '\0';
  37.     return 0;
  38.     }
  39.  
  40. }
  41.  
  42. int Wrapper::TestFunc(System::String ^%s, int n) { //%sとすることで参照渡しとなる。ByRef相当。
  43.     IntPtr ptr = Marshal::AllocCoTaskMem(n+1);//malloc相当。アンマネージド領域を確保。
  44.     test_func((char *)ptr.ToPointer(), n);//.ToPointer()でアンマネージドなポインタを得る
  45.     s = Marshal::PtrToStringAnsi(ptr);//Stringに変換
  46.     Marshal::FreeCoTaskMem(ptr);//free相当
  47.     return 0;
  48. }
  49.  
  50.  
  51. // 上のライブラリをVB.NETから参照するとき
  52.  
  53. // 同じソリューション内に新規プロジェクトとしてWindowsFormsApplicationとして作成。作成したプロジェクトをスタートアッププロジェクトとして指定すると、ライブラリも一緒にデバッグできる。
  54. // Form1にTextBoxとButtonを配置。テキストボックスに数字を入力すると、上のライブラリで数字の数だけaが出力されるので、メッセージボックスで表示する。
  55. /*
  56. Public Class Form1
  57.  
  58.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  59.         Dim teststr As String
  60.         wrapper.Wrapper.TestFunc(teststr, CInt(TextBox1.Text))
  61.         MessageBox.Show(teststr)
  62.  
  63.     End Sub
  64.  
  65. End Class
  66. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement