// 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