Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement