C関数をVisual Basicで呼び出してみた

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

C関数をVisual Basicで呼び出してみた

投稿記事 by naohiro19 » 13年前

環境:Windows 7 (64ビット)
コンパイラ : VIsual Studio 2012 RC

C関数は以下のように実装されています。

CODE:

//greet.h
#ifndef DEF_GREET
#define DEF_GREET

const wchar_t* greet(const wchar_t* name);

#endif

//greet.cpp
#include "greet.h"
#include 

const wchar_t* greet(const wchar_t* name)
{
	static wchar_t result[256];
	wcscpy_s(result, 256, name);
	wcscat_s(result, 256, L"さん、こんにちは");
	return result;
}
このプログラムをスタティックライブラリにしてビルドします(コード生成は「マルチスレッドDLL」もしくは「マルチスレッドデバッグDLL」にしないとCLRプロジェクトでエラーになる)。
次に前回登場したConvString.hの出番です。
ConvString.hがバグが無いことを確認してください。
CLRプロジェクト(GreetLib)を作成します。以下のコードを用意します。

CODE:

//GreetLib.h
#pragma once

using namespace System;

public ref class GreetLib
{
public:
	static String^ Greet(String^ name);

};

//GreetLib.cpp
#include "GreetLib.h"
#include "greet.h"
#include "ConvString.h"

String^ GreetLib::Greet(String^ name){
	std::wstring input = ConvertCLIString::ToWideString(name); //CLI文字列をstd::wstringに変換
	std::wstring result = greet(input.c_str() ); //greet関数を呼び出す
	return ConvertCLIString::WideStringToCLI(result);  //std::wstringをCLI文字列に変換
}
GreetLibプロジェクトのライブラリディレクトリ・インクルードディレクトリはgreetのパスを指定します。
ビルドしてエラーもなかったら成功です。このGreetLibはVisual Basic/C#から参照できるのでWindows フォームアプリケーションでテキストボックス(2個)とボタンを設定して以下のプログラム(VB)を記述します。

CODE:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ResultText.Text = GreetLib.Greet(NameText.Text)
    End Sub
End Class
Greetは静的メソッドになっています。
テキストボックスに「○○さん、こんにちは」と表示されていたら成功です。
最後に編集したユーザー naohiro19 on 2012年6月17日(日) 17:17 [ 編集 1 回目 ]

コメントはまだありません。