- PR -

ネイティブコードのDLLへの参照渡しの方法(文字列型)

投稿者投稿内容
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-10 11:30
ほむらです。
また偶然なのですけど
こんなページ見つけました。
--------

[HOW TO] Visual C++ .NET で System::String*から char* に変換する方法


#googleキーワード:.NET System::String
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-10 13:43
みなさん、
いろんな情報をありがとうございます。

いろいろ試していたのですが、
GetData()関数を単独でDLLに記述しておくと、
きちんと値を取り出すことができました。


実際は、この関数以外もDLL内に入っているので、
どこかで参照などしてないところがあり、
きちんと動作していないのが原因だったと思います。

#いろいろ考えて頂いて申し訳ありません。m(_ _)m


例えば、ヘッダファイル等を
インクルードしている場合は、
(VC++.NET 2002環境での話ですが)
該当Projectの[プロパティページ]-[追加のインクルードディレクトリ]に
ヘッダファイル群を参照できるようにしてあげないと、
いけない・・・とか?

# ↑これでも動かなかったので、
# まだ何か足りないのだろうか・・・?
# それとも検討違いかな?



引用:

それなら普通にネイティブにリンクするほうが自然ですし、何のためのMC++ですかってなっちゃいますよ。
meiさんがやり方は書いてくれているのでその手順でやりましょう。


そうなんですかぁ。
この方法も試してみます。

引用:

というより、kernel32.dllの関数なんて、自分で宣言は一切追加せず呼べますよ…。


これも知りませんでした。(−−;)
サンプル通りにやってみただけなんですけど。
要らないんですね。


ついでに参照渡しについて、
下記のページを見つけました。

Buffers のサンプル


ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-02-10 14:36
引用:

これも知りませんでした。(−−;)
サンプル通りにやってみただけなんですけど。
要らないんですね。



Win32APIっていうレベルの関数ですから。

思ったんですけど、VisualC++(.NETではない)についての開発についての基本的知識が微妙ではないですか?
ManagedC++というのはこれらの基礎的知識の上に.NET Framework用の拡張を施したものなので、どうしてもWin32ネイティブの考え方、コーディング等が必要になります。そういう泥臭さをあまり考えたくないならせっかくC#というものも用意されているのですし、そっちを使ったほうがいいと思いますよ(何か事情がありそうですが…)。

[ メッセージ編集済み 編集者: ya 編集日時 2004-02-10 14:59 ]
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-10 18:25
優希です。

引用:

思ったんですけど、VisualC++(.NETではない)についての開発についての基本的知識が微妙ではないですか?
ManagedC++というのはこれらの基礎的知識の上に.NET Framework用の拡張を施したものなので、どうしてもWin32ネイティブの考え方、コーディング等が必要になります。そういう泥臭さをあまり考えたくないならせっかくC#というものも用意されているのですし、そっちを使ったほうがいいと思いますよ(何か事情がありそうですが…)。



そうですねぇ。
あまり詳しくはないです(−−;)
できるなら、C#の方が良いのですが、
開発環境はVC++.Netと決まってしまっているので・・・。
頑張るしかないですね。


それで、meiさんのサンプルソースを
真似て作っているところです。

【実施内容】
ライブラリ(Sample.lib)とインクルードファイル(Sample.h)を
それぞれ"Lib"、"include"フォルダに格納する。

VC++のメニュー[ツール]→[オプション]の
[プロジェクト\VC++ ディレクトリ]の
「ディレクトリを表示するプロジェクト:ライブラリ」で、
先ほどの「Lib」フォルダを追加。
同様に、「include」も追加する。


コード:
#include <wtypes.h>
#include "Sample.h"

// Sample.dllのlibをリンク
#pragma comment(lib, "Sample.lib")

///
/// GetData()関数の実行メソッド
///
void process()
{
	char buf1[32];
	char buf2[32];

    // 取りあえずUnmanaged関数をそのまま呼ぶ
	GetData(10, buf1, buf2);

    // 必要に応じてString型へ
	String* s1 = new String(buf1);
	String* s2 = new String(buf2);

}



上記のようにやっていますが、
先程のINIファイルの読み込む関数で
「DllImport」を使っていると、
"メタデータの操作に失敗しました。"
とビルドエラーになります。

「DllImport」と「#pragma comment」は
2つ使えないのですか?
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-02-10 21:31
引用:

上記のようにやっていますが、
先程のINIファイルの読み込む関数で
「DllImport」を使っていると、
"メタデータの操作に失敗しました。"
とビルドエラーになります。

「DllImport」と「#pragma comment」は
2つ使えないのですか?



おんなじ名前の実体が二つ以上あるとリンク段階で当然エラー(どっちを使えばいいかわかりませんし)になります。
libファイルをリンクした段階でその名前を持った関数(DLL側)は実体をもちます。そして、DLLImportAttributeをつけても実体を持つので。

スキルアップ/キャリアアップ(JOB@IT)