hiro1357 icon

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

hiro1357 | PRO | 04/05/18 05:18:52 PM UTC | 0 ⭐ | 334 👁️ | Never ⏰ | []
C++ |

1.96 KB

|

None

|

0 👍

/

0 👎

// C++/CLIでWrapperライブラリを書きたい時用サンプル
 
 
// wrapper.h
 
#pragma once
 
using namespace System;
 
namespace wrapper {
 
    public ref class Wrapper
    {
        // TODO: このクラスの、ユーザーのメソッドをここに追加してください。
    public:
        static int TestFunc(System::String ^%s, int n);//staticをつけることで、スタティックメソッドとして扱われる。
    };
}
 
 
// wrapper.cpp
 
#include "stdafx.h"
 
#include "testlib.h"
#include <string.h>
 
using namespace wrapper;
using namespace System;
using namespace System::Runtime::InteropServices;
 
extern "C" {
 
    int test_func(char *p, int n){
        memset(p, 'a', n);
        p[n] = '\0';
    return 0;
    }
 
}
 
int Wrapper::TestFunc(System::String ^%s, int n) { //%sとすることで参照渡しとなる。ByRef相当。
    IntPtr ptr = Marshal::AllocCoTaskMem(n+1);//malloc相当。アンマネージド領域を確保。
    test_func((char *)ptr.ToPointer(), n);//.ToPointer()でアンマネージドなポインタを得る
    s = Marshal::PtrToStringAnsi(ptr);//Stringに変換
    Marshal::FreeCoTaskMem(ptr);//free相当
    return 0;
}
 
 
// 上のライブラリをVB.NETから参照するとき
 
// 同じソリューション内に新規プロジェクトとしてWindowsFormsApplicationとして作成。作成したプロジェクトをスタートアッププロジェクトとして指定すると、ライブラリも一緒にデバッグできる。
// Form1にTextBoxとButtonを配置。テキストボックスに数字を入力すると、上のライブラリで数字の数だけaが出力されるので、メッセージボックスで表示する。
/*
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim teststr As String
        wrapper.Wrapper.TestFunc(teststr, CInt(TextBox1.Text))
        MessageBox.Show(teststr)
 
    End Sub
 
End Class
*/

Comments