お世話になります。

C#からC++のNativeコード(unmanaged)を呼び出したいと思い、C++/CLIでラッパーを作りました。

そのラッパーのクラス内で、C++で書かれたNativeコードのクラスのインスタンスを作成する時に例外が発生してしまいます。

例外はこんな感じです。

System.Runtime.InteropServices.SEHException はハンドルされませんでした。
Message="外部コンポーネントが例外をスローしました。"
Source="ManMovLib"
ErrorCode=-2147467259(0x80004005)
StackTrace:
場所 new(UInt32 )

C++/CLIは以下の様なコードで、コンストラクタ内でC++のクラスの実体を作っています。そして、このnewで例外が発生します。
AVSource::AVSource(void)
{
  m_pObj = new CAVSource;
}

C++側は、実は何もしていません。
CAVSource::CAVSource(void)
{
}

そして、色々と試行錯誤をした結果、C++側のクラスにvirtual関数があると、例外が出てしまうという事実を突き止めました。
ただ、どこを調べても、virtual関数を用いてはいけないとは書いてありません。
実際、virtualを使ってはいけないという制約があるのでしょうか?
また、何かNativeのコードを作成する際に注意点とかありますでしょうか?

ちなみに、プロジェクトの設定で、Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、何故かこの例外は発生せずに、全て正常に動きます。これもなぞです。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

http://www.codeproject.com/KB/mcpp/quickcppcli.a …

が参考になれば幸いです。

5. Make sure you delete the native pointer in the destructor of the managed class.

とか。



http://www.amazon.com/Expert-Visual-CLI-Programm …

の Search inside this book で

CHAPTER 10 Wrapping Native Libraries
・・・
 Wapping C++ Classes
   Mapping C++ Exeptions to Managed Exceptions

とかあるのを見ると、「Nativeコードのデバッグを可能にするチェックをつけてデバッグ実行すると、」native側の例外をManaged側の例外として捕捉してくれるのかも(単なる想像ですが・・・)。

この回答への補足

ご回答有難うございます。

教えて頂いたURL見てきました。
デストラクタ内でのNativeの実体の削除は行なっていますが、例外が出ている所がnewですので、どうしたものかと。

それと、本のご紹介も有難うございました。
C++/CLIの本が出ているのですね、知りませんでした。
こちらを読み込めば、何かヒントが見つかるかもしれませんね。

補足日時:2009/05/21 10:13
    • good
    • 0
この回答へのお礼

すみません、お礼を付け忘れてしまいました。
また何かありましたら、よろしくお願いします。

お礼日時:2009/05/21 10:19

下手にラッパーを作ると、ラッパーの生成時に例外を吐くので、ラッパーを作ってはいけません。



以下のフォーラムを参考にして下さい。
http://vsug.jp/tabid/63/forumid/45/postid/2892/v …

この回答への補足

ご回答有難うございます。

フォーラムの方も見てみたのですが、いまひとつ分りません。
unmanagedのC++ライブラリをDLLにして、P/Invokeで呼び出すという事でしょうか?

ちなみに、C++/CLIでラップするという方法は、以下のサイトで知りました。
http://www.atmarkit.co.jp/fdotnet/special/vcppin …

現在、C++/CLIでラップするクラス群を作ってしまっていて、C#もその仕様に合わせて作り始めています。
出来れば、ラッパーを上手に作る方法を解説しているサイト等あれば、教えて頂ければ幸いです。

補足日時:2009/05/20 15:02
    • good
    • 0
この回答へのお礼

参考になりました。
有難うございました。

お礼日時:2009/05/21 17:08

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qふと、思ったのですが、fromなくても文は成り立ちますか? なぜ例外的に前置詞が残っているのですか?

ふと、思ったのですが、fromなくても文は成り立ちますか?
なぜ例外的に前置詞が残っているのですか?
気になって眠れないので簡単にでいいので説明よろしくお願いします

Where are you from?

英語英語英語

Aベストアンサー

from がなくても文としては成立するけど, 意味は変わるね.

あぁ, from の意味は分かってるよね?

QC,C++,C++/CLIの構造体とクラス

C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが
privateかpublicかという違い「だけ」しか全くないのでしょうか?

クラスにおける
value class / ref class
という分類はC++/CLIのもので
これについては
value class の方は C言語の構造体に近いという事でいいでしょうか?

ref classの方は
ネイティブのC++のクラスを
マネージ用にしたようなもので

C++/CLIの構造体は
C++のそれと同じで
OKですか?

そしてそれらの構造体には、値型・参照型といった分類はないのでしょうか?

Aベストアンサー

> ということは、structも継承可、という事でしょうか?

structでも継承可能です。

> 継承のアクセス指定の方は
> クラスと構造体ではどうなるのでしょうか?

class A : Base {};



class A : private Base {};

と等価です。
一方、

struct A : Base {};



struct A : public Base {};

と等価です。

> そして「集成体」というのが初めて知ったのですが
> これはいわゆる、配列や・・・ある条件下でのクラス・・?
> なのでしょうか?

配列と以下の条件をすべて満たすクラスのことです。
・ユーザー定義のコンストラクタを持たない
・非公開または限定公開のメンバを持たない
・基底クラスを持たない
・仮想関数を持たない

ちなみにC言語の集成体は、配列と構造体の総称です(共用体は集成体ではありません)。

Q英語のスペルと発音の関係ですが、sayを[sei]と発音しますが3人称

英語のスペルと発音の関係ですが、sayを[sei]と発音しますが3人称単数ではsaysを[sez]、過去形saidを[sed]と発音します。例外ですませれば簡単なのですが、aは元々すべてanで後ろに子音から始まる単語は発音しづらいからaに変化したと大学時代に習いました。何か歴史的な理由があると思います。どなたか英語史に詳しい方、教えていただけないでしょうか。

Aベストアンサー

これは例外という以外の説明はつかないと思います。歴史的にさかのぼると

古英語で saegth [saejθ], saegde [saejde](ae は綴り、発音記号ともつながった文字と考えてください。th に相当する古英語・中英語の文字は th で代用しておきます。不定詞・一人称単数・複数はそれぞれ secgan, secge, secgath で cg は bridge の dg のように発音します。この発音はすぐに二、三人称の g [j] に統一されました)

中英語で seyeth [sei(j)eθ], seyde [seide]

いずれも [ei] ないし [ej] で、短母音で発音されたことはありません。中英語期は正書法のようなものは厳密にはなく、書き手によって違いがありますが、それでも各々が発音をなるべく正確に写そうと工夫したもので、[seθ, sed] と読める綴りはありません。近代英語になり徐々に三単現は s に置き換わるようになりましたがやはり [e] と明確に読ませるような綴りはありません。これはつまり発音がいつ頃 [e] になったのかを特定するのがほぼ不可能ということです。

ここで、今では古文体専用となった thou に対する形を見ると

thou sayest / sayst

の2通りの綴りがあります。これらは [seiist / seist] であり [sest] という発音はありません。古英語・中英語でも saegst[saejst], sey(e)st[sei(je)st] で [e] ではありません。
大昔から、現代において古文として読むときまで [sest] と発音されたことはないことになります。

綴りに目に見える変化が現れれば、大体そのころ発音の変化が起きたことが想像がつきますが、変化がない場合時代を特定するのは非常に困難になります。録音が可能になってからの変化であれば辞書に古い発音として載ることもありますが、それすらないということはそれ以前にはすでに変わっていたということです。again(st) の gai が [ge, gei] ともに発音されることはご存知と思いますが、これも同様にいつ変わったのかよく分かりません。

このように、いつ変わったのかは特定不可能ですが、「なぜ」変わったのかのヒントになりそうなことはあります。ただしそれについて書かれた文圏を見たことがありませんので、あくまで推測です。
それは says, said の「弱形」の存在です。一般的な動詞はアクセントを持たないときも発音が大きく変わることはありませんが、say, said は直接話法や that 節を導入する際、ay/ai の部分がほとんど曖昧母音になることがあるそうです。これはあくまで現代語の場合ですが、昔 [seiz, seid] が通常の発音だった頃、弱い形として二重母音が短母音になったことがあるではあるまいか。そしてこれが標準的な発音にとって代わったのではないか、と想像することができます。

says/said の弱形については記載していない辞書もあるかと思いますが、参考にした岩波英和大辞典には記載があります。

なお、
>anで後ろに子音から始まる単語は発音しづらいから
冠詞はアクセントを持たないという点が重要です。n と子音が接触することよりも an にアクセントがないと *an man が ほとんど 'n man のようになり語頭に不自然な子音結合ができるので、これを避けることを選択するようになった結果です。冠詞にアクセントがあると不自然さはありませんが、an man のような言い方は結局廃れ a [ei] man となりました。

これは例外という以外の説明はつかないと思います。歴史的にさかのぼると

古英語で saegth [saejθ], saegde [saejde](ae は綴り、発音記号ともつながった文字と考えてください。th に相当する古英語・中英語の文字は th で代用しておきます。不定詞・一人称単数・複数はそれぞれ secgan, secge, secgath で cg は bridge の dg のように発音します。この発音はすぐに二、三人称の g [j] に統一されました)

中英語で seyeth [sei(j)eθ], seyde [seide]

いずれも [ei] ないし [ej] で、短母音で発音され...続きを読む

QC++/CLIで、アンマネージC++のDLLを使用する方法

こんにちは。
C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。
ネット上をいろいろ調べたのですが、具体的な手段がわかりません。
見よう見まねで以下のようにサンプルを作成したのですが、コンパイルすら通る状況になりません。
かなり基本的な問題がありそうで申し訳ないのですが、下記の問題点を教えていただけないでしょうか。

また、参考になりそうなサイトなどありましたら教えていただけると大変助かります。

■アンマネージC++のDLL
VC++6.0で、以下のように、単にデバッグ文字列を書き出すだけのDLL関数を作成しました。
(このDLLが使用できることは他のVC++6.0プロジェクトで確認済みです)
/*-----Func.h-----*/
#ifndef __FUNC_H__
#define __FUNC_H__

AFX_EXT_CLASS void WINAPI ShowMessage();

#endif//__FUNC_H__

/*-----Func.cpp-----*/
#include "StdAfx.h"
#include "Func.h"
#include <stdio.h>

void WINAPI ShowMessage()
{
CString str = "This is The Message from DLL Func!\n";
OutputDebugString(str);
}

■C++/CLI でのDLL使用
Visual Studio2008にて、C++のCLRプロジェクトを作成して、以下のようにDLLを使用する準備を行いました。
1.ソリューションエクスプローラのヘッダフォルダに、Func.hを追加
2.プロジェクトのフォルダに、上記で作成したFuncのDLLとLIBファイルを置く。
3.プロジェクトの「プロパティ > C/C++ > プリプロセッサ > プリプロセッサの定義」に、"_AFXDLL"を追加
4.mainクラスのソースに以下を記述
/*----------*/
using namespace System;
#include "Func.h"
#using "ManagedDllApp.dll"

int main()
{
ShowMessage();
return 0;
}
/*----------*/

この状態でコンパイルすると、
「エラー3error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。d:\xxx\Func.h4Console
」等、Func.h周りで複数のエラーが出ます。
また、Func.hをインポートしないでコンパイルすると、
「エラー3fatal error C1113: #using が 'd:\xxx\manageddllapp.dll' で失敗しました。」と、Dllでエラーが出ます。

よろしくお願いいたします。

こんにちは。
C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。
ネット上をいろいろ調べたのですが、具体的な手段がわかりません。
見よう見まねで以下のようにサンプルを作成したのですが、コンパイルすら通る状況になりません。
かなり基本的な問題がありそうで申し訳ないのですが、下記の問題点を教えていただけないでしょうか。

また、参考になりそうなサイトなどありましたら教えていただけると大変助かります。

■アンマネージC++のDLL
VC++6.0で、以下のように、単にデ...続きを読む

Aベストアンサー

 こんばんは。御礼頂きました。
 Func.hの中にインクルードし忘れがある様です。準備が出来たら、必ず「ソリューションのリビルド」をして下さい。
 以下は DLL->VC6.0Pro CLR->VC2005Pro で確認しています。

/*-----Func.h-----*/
#ifndef __FUNC_H__
#define __FUNC_H__

#include"afxver_.h"//此れと
#include"afxv_dll.h"//此れと
#include<windows.h>//此れをインクルード

AFX_EXT_CLASS void WINAPI ShowMessage();

#endif //__FUNC_H__

//以下はCLRアプリ側

/*-----stdafx.h-----*/
// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。
//
#pragma once

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。
#include"func.h"
#pragma comment(lib, "libの名前.lib")

/*-----clrconsole.cpp-----*/
// clrconsole.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args)
{
::ShowMessage();
return 0;
}

 こんばんは。御礼頂きました。
 Func.hの中にインクルードし忘れがある様です。準備が出来たら、必ず「ソリューションのリビルド」をして下さい。
 以下は DLL->VC6.0Pro CLR->VC2005Pro で確認しています。

/*-----Func.h-----*/
#ifndef __FUNC_H__
#define __FUNC_H__

#include"afxver_.h"//此れと
#include"afxv_dll.h"//此れと
#include<windows.h>//此れをインクルード

AFX_EXT_CLASS void WINAPI ShowMessage();

#endif //__FUNC_H__

//以下はCLRアプリ側

/*-----stdafx.h-...続きを読む

Q英語と数学

私の周りで英語が得意な人は数学が苦手だといいます。数学が得意な人は英語が苦手だといいます(先生や親戚、友人など)。

だいぶ前の「あるある大辞典」で得意科目は遺伝が関係していると言ってたような気がします。これは偶然に私の周りの人はそうだったということでしょうか?
今のところ例外はないのですが・・・

Aベストアンサー

あけましておめでとうございます。

アメリカに36年住んでいる者です。 私なりに書かせてくださいね。

たしかに能力に遺伝というものは働いているでしょう。 それが単に得て不得手と言う一般的なものから、極端に例としてIQは低いけどある一種のことにおいてはコンピューターも顔負け、と言う人もいますね。 数字に関してならすば抜けて記憶力がいいとか、単語力は抜群とか。

しかし、能力もそうですが、苦手・得意も遺伝もあるでしょうが、学説的にも証明されているように、生まれ持ったものだけが人を作り上げるわけではありませんね。

育った環境もそうですが、具体的にに私みたいに初めて英語に接した時の中学の英語の先生が好きになってしまったから人一倍に勉強したとか、ちょっとしたきっかけで基本が見えるようになったお陰で科目が好きになりそれが「得意」とされる物になったと言う事もあるでしょう。 勉強が苦にならないと言う事ですね。

また、得意・苦手はあくまでも何かと比較した物ですね。 他の人と比較したのでもあるでしょうし、英語の優等生であったけど大学や社会に入ったらできる人はもっといたため「得意」とはもう言えなくなったとか。

多くの日本人留学生が感じる事はこの逆ですね。 日本では数学の授業についていけなかったにもかかわらずこちらに来たらかなり程度の低い事をやっていて成績はAばっかりをとるようになり「得意」の科目になったと言う人はたくさんいると思います。 

また、「得意」といえる(ほかの人や物と比較して)ようになったため心理的に楽になったり、復習になったおかげで数学観念」が分かる様になり、勉強も進んでするようになりいい結果を生み出す原因にもなる事もありますね。

英語にしても英語学は苦手だったけど、社会に入り何かの理由で英語を使うようになり人からは「得意」と言われる事にもなった人もいると思います。

と言う事で、遺伝が関係していないとは断言しませんが他にもたくさんの理由があると私は信じます。

だからこそ、モチベーションと言う物を知ることによって「苦手」を「得意」に変える事ができると信じることができるようになり実際に得意なもの(少なくとも苦手と感じる事がなくなる)と言う事に自分を持っていけるようになるわけです。 モチベーションがこのアメリカで既に50年以上も重要性を認識された理由でもあります。

余談です。

4430+4431+4432+4433+4434+4435+4436+4437+4438+4439=が2秒以内にできる人は

1) 数学の観念が心から分かっている人
2) 雑学知識を持っている人 (9個の数字だったらどうでしょうか)
3) まぐれ

さて皆さんはどちらですか?

ちなみに私は高校の数学にいつも3週間ほど遅れていて大学の受験には自信がなかったためにある人に言われ中学の問題集(同じ事を何回もさせるタイプ)をとことんまでやったため一応「得意」な科目になり、アメリカの学校で「得意」がることができ、今では数字の観念が見始めている素人数学者です。 <g>

と言う事で、両方得意、両方ダメ、片方だけ得意という人はたくさんいると思います。

これでいかがでしょうか。 分かりにくい点がありましたら、補足質問してください。

あけましておめでとうございます。

アメリカに36年住んでいる者です。 私なりに書かせてくださいね。

たしかに能力に遺伝というものは働いているでしょう。 それが単に得て不得手と言う一般的なものから、極端に例としてIQは低いけどある一種のことにおいてはコンピューターも顔負け、と言う人もいますね。 数字に関してならすば抜けて記憶力がいいとか、単語力は抜群とか。

しかし、能力もそうですが、苦手・得意も遺伝もあるでしょうが、学説的にも証明されているように、生まれ持ったものだけが人...続きを読む

Q【VC++】MFC、C++/CLI(CLR)、C#の違い、及び、これからの展望

いつも大変お世話になっています。
VC++初心者です。

VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を
同時期に使い始めて何ヶ月か経ちました。
現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、
逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。
(CLIの開発では、WEBにあるC#のコードを参考にしながら、
 コーディングしています。)

そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。
(1)CLIとC#を区別した理由は何なのでしょうか。
(2)MFCはこれからも使われるのでしょうか。
 (MFCで新規開発をすることは、まだまだ大勢なのでしょうか。)
(3)VC++2005以降、MFCは有償らしいのですが、
 VC++6.0(MFC)とVC++2005(MFC)は何か変わったのでしょうか。
 (コーディングしやすくなっていますか?)
(4)個人差はあると思いますが、開発スピードが一番早いのは、
 CLR、C#、MFCのどれでしょうか。
 
すぐに返信ができないと思いますが、
宜しければ、ご回答頂けると幸いです。

いつも大変お世話になっています。
VC++初心者です。

VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を
同時期に使い始めて何ヶ月か経ちました。
現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、
逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。
(CLIの開発では、WEBにあるC#のコードを参考にしながら、
 コーディングしています。)

そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。
(1)CLIとC#を区別した理由は何なのでしょうか...続きを読む

Aベストアンサー

私も私見ですが。

> (1)CLIとC#を区別した理由は何なのでしょうか。
CLIはC++的だが、C#はJava系の文法。近いけど遠い。
要するに慣れ親しんだC++を使いたい人向け。

> (2)MFCはこれからも使われるのでしょうか。
市販ソフトメーカーなど企業で資産のあるところは使っていくでしょうね。シェア・フリーソフトの作家でもそうですが。
C#とCLIは、インストール時に.net frameworkのインストールがあるから嫌われている所があるんじゃないでしょうか。.net系のソフトですよってばれますし。逆コンパイルがネイティブより容易ってのがライセンス認証しているメーカーとかシェアウェア作者さんには気になるポイントでしょう。一応難読化ツールもありますが。

> (4)個人差はあると思いますが、開発スピードが一番早いのは、
> C++/CLI、C#、C++とMFCのどれでしょうか。
C#かなぁ。
まぁ、面倒なソフトになったらどれでもさほど変わり無い気がしますね。ただ、.NET系はガベージコレクションがうれしいですが。

私も私見ですが。

> (1)CLIとC#を区別した理由は何なのでしょうか。
CLIはC++的だが、C#はJava系の文法。近いけど遠い。
要するに慣れ親しんだC++を使いたい人向け。

> (2)MFCはこれからも使われるのでしょうか。
市販ソフトメーカーなど企業で資産のあるところは使っていくでしょうね。シェア・フリーソフトの作家でもそうですが。
C#とCLIは、インストール時に.net frameworkのインストールがあるから嫌われている所があるんじゃないでしょうか。.net系のソフトですよってばれますし。逆コンパイルが...続きを読む

Q英語で「ja」を「ヤ」と発音することもある?

Jacobという人名は「ヤコブ」と「ジェイコブ」という二通りの読み方がありますよね。
調べたところ、前者はヨーロッパ式の読み方で、後者は英語式の読み方のようなのですが、英語圏の国で「ja」というスペルを「ヤ」と発音することもあるのでしょうか?
(例:Japanはジャパンですが、読もうと思えば「ヤパン」と発音することも可能なのですか?)

英米人の名前で「Jacobさん」という人がいれば、ほぼ例外なく「ジェイコブさん」とお読みするのでしょうか?
他にも「ja」をジャでなく「ヤ」で発音する英単語(人名に限らず)はありますか?

Aベストアンサー

「Jacob」は英語では必ず「ジェイコブ」(もう少し原音に近づけると「ヂェィカブ」)と発音します。たとえ、それが聖書に出てくるヤコブのことでも。
(英語の「j」は、舌を上顎につけない「ジ」よりも、上顎につける「ヂ」の表記で書き表す方が原音をより具体的に表しているのですが、ここでの回答にはそぐわないので、詳しくは述べません。)

「Ja」を「ヤ」で発音する英単語は、ごく少数ですがあります。
たぶん、いちばんよく目にするのは「hallelujah」(発音は『ハレルーヤ』)だと思います。
ほかには、次のような例もあります。
・デンマークの作家「ヤコブセン(Jacobsen)」
・ドイツの心理学者「ユング(Jung)」
・ドイツの青年貴族を意味する「ユンカー(junker)」
ご推察できるように、ヨーロッパ大陸北部の人名や階級名、地名がほとんどです。

なお、スペイン語では、「ja」を、喉を狭めて息を吐き出す方法で発音し、「ハ」の音に近く聞こえます。
したがって、スペイン語由来の外来語では、「ja」を「ヂャ」とも「ヤ」とも読まない例があります(以下『』内が英語での発音です)。
・San Jose『サン・ホゼィ』:カリフォルニア南部の都市。
・San Jose『サン・ホーセ』:コスタリカの首都。
・Marijuana『マリワーナ』:マリファナ。
・Jota『ホタ』:ホタ(スペインの伝統舞踊のひとつ)。

「Jacob」は英語では必ず「ジェイコブ」(もう少し原音に近づけると「ヂェィカブ」)と発音します。たとえ、それが聖書に出てくるヤコブのことでも。
(英語の「j」は、舌を上顎につけない「ジ」よりも、上顎につける「ヂ」の表記で書き表す方が原音をより具体的に表しているのですが、ここでの回答にはそぐわないので、詳しくは述べません。)

「Ja」を「ヤ」で発音する英単語は、ごく少数ですがあります。
たぶん、いちばんよく目にするのは「hallelujah」(発音は『ハレルーヤ』)だと思います。
ほかには、...続きを読む

QMFC C++ と C++/CLI の文字列

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上手く行きません。

Wrapper/Appli は System.CString で統一したいのですが、
Library ではどのような型として宣言すれば文字列のやり取りができるでしょうか。
( 引数・戻値の両者 )

CString wchar_t* char* System.String ALT::CStringT basic_string _bstr_t CComBSTR
LPCTSTR LPTSTR PCTSTR PTSTR LPCWSTR LPWSTR PCWSTR PWSTR BSTR…

なお、Library で下記のようにエクスポートし
__declspec(dllexport) BSTR test(LPCTSTR data);
wrapper で
BSTR hoge(LPCTSTR value){ return test(value); }
と宣言すると、wrapperのビルドで下記のエラーが表示されます。

エラー1error LNK2028: 未解決のトークン (0A000B39)
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー2error LNK2019: 未解決の外部シンボル
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー3fatal error LNK1120: 外部参照 2 が未解決です。

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上...続きを読む

Aベストアンサー

Library の DLL に対して
Dumpbin /exports XXXXX.dll
とするとどうなりますか?

Q“B1F”は和製英語か

 日本の繁華街や大きなスーパー、デパートなどで、地下一階のことが、ほぼ例外なく“B1F”と略記されています。疑問に思って、この“B”とは何かを調べたら、“basement”のbなんですよね。「地下一階」は、正確には、“the first basement”と言うと思うのですが、それでは、“B1F”というのは、和製英語で、英語としては間違いなのでしょうか。また、それならば、「地下一階」は、正しい英語では、どのように略記されるのでしょうか。“1st B.”とでもなるのでしょうか。ご存じの方、よろしくご教示お願い致します。

Aベストアンサー

B1F という表現は、例えば日本のデパートの英文説明で fist basement floor(B1F)のように書いてあったりしますが、これはエレベーターや階案内にB1Fとよく書いてあるので、それもいしきしているかもしれませんが、米国では見たことないです。

米国で圧倒的に多いのは levelを使った表現です。Basement Level 1, B-1 Lebel, B1 Level とか。エレベータ内などにこう書いてあります。また、建物図面などでは BASEMENT LEVEL 1 といった表現。

他には、Basement Floor 1, Fist Basement Floorなどもでてきますね。表示には後者は長すぎるかもしれませんね。

地下一階までの建物だったら、floorとかlevelを使わなくても、例えば、His office is located in the basement (of the ABC building). などといえます。

QC++/CLIのクラスについて

現在, VC++2008のC++/CLIを用いてプラグラムを作成しています。

値を与えると,計算した値を返すクラスを一回の処理の何度も使用しています。

Keisa^ kei = gcnew Keisa;
kekka1 = keisan->exec(1);
kekka2 = keisan->exec(2);
kekka3 = keisan->exec(3);
delete kei;

///上記のkekkaを使用した処理///

kekka1=0;
kekka2=0;
kekka3=0;

上記のように書いて,実行すると,
 kekka2にはkekka1 + kekka2を合計した値
kekka3にはkekka1 + kekka2 + kekka3を合計した値
のように,積算した値になってしまいます。(しかもなぜか,releaseフォルダ内の.exeファイルから実行した場合のみです...)

クラスを使用した後の後処理に問題があるのかもしれませんが,知識がなくわかりません。
お分かりの方がいらっしゃいましたら,ご教授お願い致します。

Aベストアンサー

変数を初期化しないで使っているに一票
Releaseビルドでだけおかしいのは「Debugビルドでは自動変数も初期化するから動いているように見える」ってことだと思う。
ビルド時は警告レベルを上げることをお勧めします。

なんにせよ,Keisaクラスの定義、execの定義も無いとわかりません。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング