11/11/10 07:34:24.84
質問です。
ネイティブ(アンマネージド)なC++の静的ライブラリを
C++/CLIでリンクして使うと変な所で死んだりするんだけど、
こういう事しちゃだめなのでしょうか?
一旦ネイティブなDLLを作って、そこを介して呼べば死なないのですが・・・。
そのライブラリは実装を隠蔽するため
クラスのインタフェース部分のみ公開して、
インスタンスの生成と開放を関数化してあるのですが、
つまりはnew/deleteがライブラリ内で実行され、
ライブラリ内でnewした結果を返し、マネージドコード内で保持し、
そのポインタをライブラリに渡してdeleteしてもらう形になっています。
よく分からないのは、わざとnewをせずポインタをNULLで初期化したままにしておき、
「NULLでなければ開放関数を呼ぶ」というコードを書いただけでも、
そこで死んでしまうのです。(NULLなので開放関数は呼ばれない!)
vectorヘッダをインクルードするかしないかで、死んだり死ななかったりと、
挙動がおかしすぎて正直よく分からない状況です。
425:デフォルトの名無しさん
11/11/10 16:05:38.55
ファイナライザが別スレッドから呼ばれるからとかじゃない
426:デフォルトの名無しさん
11/11/12 18:54:13.34
using使ってるのでそこは大丈夫だと思います
427:デフォルトの名無しさん
11/11/12 23:05:46.09
(gcnew Form1)->Show();
で作成されたフォームに
元のフォームにある文字列変数を渡す方法があったら教えてください
428:デフォルトの名無しさん
11/11/12 23:10:34.52
コンストラクタの引数で渡すかプロパティ定義して渡す
つかそれだとC#もC++もさっぱりだよね? ならまだ遅くないから今すぐC#に乗り換えること。
429:デフォルトの名無しさん
11/11/13 20:42:15.74
FindWindow で探すとか、EnumWindow でタイトルを調べるとか?
430:デフォルトの名無しさん
11/11/13 21:12:34.82
Showする前に渡せば良い
431:デフォルトの名無しさん
11/11/13 21:53:59.80
同じアプリ内でしかも.NETのフォームでFindWindow/EnumWindowとかアホか
432:デフォルトの名無しさん
11/11/17 00:53:02.53
オブジェクトとメンバ関数名を与えられたときに、その関数を呼び出すことはリフレクションを介して簡単にできますが、
指定された名前のグローバル関数を呼び出すことは可能ですか?
433:デフォルトの名無しさん
11/11/17 01:19:51.91
.NETでグローバル関数なんて使うもんじゃない
クラスの静的メンバにする
434:デフォルトの名無しさん
11/11/17 01:37:36.37
ですよねー。
435:デフォルトの名無しさん
11/11/17 14:05:35.23
グローバル関数なんて無かったんや!
436:デフォルトの名無しさん
11/11/23 22:13:47.85
自作したグローバル関数を書くのはどこが一番よろしいですか?
プロジェクト全体でつかうような関数です。
stdafx.hに書いたら
error LNK2005: "int __clrcall testfunc(void)" (?testfunc@@$$FYMHXZ) は既に stdafx.obj で定義されています。
ってエラーが出るのですが( ;∀;)
437:デフォルトの名無しさん
11/11/23 23:10:37.60
そらそうだろ
C++/CLIというか、C++の基本から勉強し直してこい
438:デフォルトの名無しさん
11/12/07 06:58:01.68
インクルードガード
439:デフォルトの名無しさん
11/12/07 07:29:07.57
関数にstaticかinlineつけて内部結合にするがよろし
440:デフォルトの名無しさん
11/12/07 15:36:45.42
ガードしても意味無いだろ。
別々のソースでインクルードされてコンパイルして、
それらをリンクしたら同じ名前の関数が複数出来上がってるわけだし。
と、ついでに質問者に説明してみる
441:デフォルトの名無しさん
11/12/07 18:59:29.54
>>440
スマヌ
442:デフォルトの名無しさん
11/12/12 18:04:16.59
あるサイトを参考にUnicodeからshift_jisに代えようとしてるんですが以下のコードで
cli::array<unsigned char^>^ ToShiftJis(System::String ^ unicodeStrings)
{
System::Text::Encoding^ unicode = System::Text::Encoding::GetEncoding(1200);
cli::array<unsigned char>^ unicodeByte = unicode->GetBytes(unicodeStrings);
System::Text::Encoding^ s_jis = System::Text::Encoding::GetEncoding(0);
cli::array<unsigned char>^ s_jisByte = System::Text::Encoding::Convert(unicode,s_jis,unicodeByte);
cli::array<unsigned char^>^ s_jisChars = gcnew cli::array<unsigned char^>(s_jis->GetCharCount(s_jisByte,0,s_jisByte->Length));
s_jis->GetChars(s_jisByte,0,s_jisByte->Length,s_jisChars,0);
return s_jisChars;
}
をビルドすると
error C2664: 'int System::Text::Encoding::GetChars(cli::array<Type> ^,int,int,cli::array<wchar_t,dimension> ^,int)' : 4 番目の引数を 'cli::array<Type> ^' から 'cli::array<Type,dimension> ^' に変換できません。
とエラーが出るのですが、どうすればよいのでしょう
どなたかご教示ください。
443:デフォルトの名無しさん
11/12/12 21:18:25.11
MFC の CString 使ったら?
444:デフォルトの名無しさん
11/12/13 04:07:52.11
Encoding.GetChars()ってChar[]とるんじゃないのか?
関係ない型をボックス化して何がしたいの?
というか、Encoding.Convert()の時点で既にSJISになっているし
445:デフォルトの名無しさん
11/12/13 13:58:16.46
Hoge hoge[x];
の要素数はsizeof(hoge)/sizeof(hoge[0])で取得できますが
Hoge *hoge=new Hoge[x];
の要素数はどうやって取得すればいいですか?
446:デフォルトの名無しさん
11/12/13 17:05:42.47
>>442
unsigned charに ^ は要らないと思うが
447:デフォルトの名無しさん
11/12/13 20:58:34.89
>>445
ネイティブ配列のサイズは自分で変数や定数で覚えとくのが基本
というかC++/CLI関係ないだろ
448:デフォルトの名無しさん
12/01/13 18:39:32.59
System::Stringからchar*に変換する関数を書きました。
半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
下記をどのように修正すればいいでしょうか?
#include <msclr/marshal.h>
inline char* toPtChar(const String^ Text)
{
String^ temp = (String^)Text;
msclr::interop::marshal_context^ context = gcnew msclr::interop::marshal_context();
return (char*)(context->marshal_as<const char*>(temp));
}
449:448
12/01/13 18:45:03.89
>半角256文字以上のテキストを投げると、255文字+\0でめられてしまいます。
半角256文字以上の文字列を投げると、255文字+\0で丸められてしまいます。
2000文字程度変換できれば良いのですが、
の間違いです。すみません。
450:448
12/01/13 19:43:34.29
関数を以下のように書き換えてSystem::String→char*しても、
やはり256文字以上は消えてしまいます。
関数ではなく、何か他に原因があるんでしょうか?
#include <msclr/marshal.h>
using namespace msclr::interop;
using namespace System::Runtime::InteropServices;
char* toPtChar(const String^ Text)
{
String^ foo = (String^)Text;
IntPtr ptr = Marshal::StringToHGlobalAnsi(foo);
return (char*)ptr.ToPointer();
}
URLリンク(is.gd)
451:デフォルトの名無しさん
12/01/16 10:35:10.44
URLリンク(www.cetix.de)
これか?
試してないけど。
452:デフォルトの名無しさん
12/01/18 17:31:31.29
◢▀▅ ▃
▋ ▋ ◢▀ ▀◣
▌ ▌ ▌ ▌
▌ ▌ ▌ ▌
▐ ▌ ▌ ▌
▐ ▀■ ▌
◢◤ ▀▃
◢◤ ◥◣
▌ ▌
▐ ● ● ▌ 馬鹿にはコピペできないの。
▌ ▌
◥◣ ╳ ◢◤
◢▀▅▃▂ ▂▂▃▅▀▅
◢◤ ▀▀▀▀▀ ◥◣
▐◣▃▌ ▐▃◢▌
◥◣▃▌ ▐▃◢◤
▀▅▃ ▂▅▀
▀■▆▅▅▅▆■█▀
▐▃▃▃▲▃▃▃◢▍
453:デフォルトの名無しさん
12/01/18 17:32:09.47
◢▀▅ ▃
▋ ▋ ◢▀ ▀◣
▌ ▌ ▌ ▌
▌ ▌ ▌ ▌
▐ ▌ ▌ ▌
▐ ▀■ ▌
◢◤ ▀▃
◢◤ ◥◣
▌ ▌
▐ ● ● ▌ 馬鹿にはコピペできないの。
▌ ▌
◥◣ ╳ ◢◤
◢▀▅▃▂ ▂▂▃▅▀▅
◢◤ ▀▀▀▀▀ ◥◣
▐◣▃▌ ▐▃◢▌
◥◣▃▌ ▐▃◢◤
▀▅▃ ▂▅▀
▀■▆▅▅▅▆■█▀
▐▃▃▃▲▃▃▃◢▍
454:デフォルトの名無しさん
12/01/18 18:05:42.86
日本の国民の中には、外国の事情がある程度分かっている人を除けば、
放送内容を信頼している人がまだいることは確かだ。一方で、ネット
住民たちのほぼ全員が、放送番組には政府の意図が色濃く反映されて
いることを知っている。自分の国がどういう国かということが、よく
分かるようになってきているのだ。
455:デフォルトの名無しさん
12/01/20 23:34:30.86
失礼します。色々まわっていたのですが此方を勧められたので此方でも質問させて頂きます。
VC++でWindowsフォームのプログラムを組んでいるのですが、
別ファイルでextern宣言したクラス(の配列)をform1.h等で参照したいのですがコンストラクタが上手く働いてくれないのか、宣言の場所が悪いのか
ゴミ値ばかりで上手く動作してくれません。
何かヒントもらえませんか?
456:デフォルトの名無しさん
12/01/21 02:53:36.13
ソース貼るか
エラー貼るか
何かヒントもらえませんか?
457:デフォルトの名無しさん
12/01/21 23:51:21.19
いきなりcharではなくwchar_tに変換
でWinAPI使ってcharに
458:デフォルトの名無しさん
12/01/22 11:17:33.74
>>455
コードも何も書かれてないから憶測でしかないが、newとgc_newを使い分けてないとか、*と^を使い分けてないとか、その辺じゃない?
後は配列が.netのクラスをちゃんと継承してないとか
生のC++とC++/CLIは全くと言って良いほど別言語で、でも生のC++も使えちゃうからC#とC++の合わせ技より罠が多く、バグが多くなり易いよ
459:デフォルトの名無しさん
12/01/23 11:32:22.34
publicにしてないとか
460:デフォルトの名無しさん
12/01/23 12:35:15.69
dll が違うとか
461:デフォルトの名無しさん
12/02/21 23:29:28.14
VC++のプロジェクトのwindowsフォームアプリでOpenMPって使えないんですかね?
'/clr:pure' と '/openmp' は同時に指定できません
ってエラーが出てるんで、CLIでは使えないのかな?とか思ったりしたんですがどうでしょう
462:デフォルトの名無しさん
12/02/21 23:38:46.12
/clr:pureで使えるわけがないだろネイティブコード入れられないんだから
/clrならどう?
っていうかWindowsフォーム使いたいだけだったら終わってるC++/CLIなんてやめて
C#でGUI作って重い計算だけC++(/CLIでない)で書いてC#から呼んだほうがいいよ
463:デフォルトの名無しさん
12/02/24 20:06:17.85
>>461 です
/clrならできました。ありがとうございます。
よくわかっていないのですが、/clr:pureにしていたのはネイティブとごっちゃになって
変なことになるのを防ぐためなんですかね?だから/clrとしてもそこらへんを気をつければ
問題ない、ということでいいんでしょうか?
C++/CLIは初めてなんで、どう”終わってる”のかわかりませんが、C#はやったことが無いので、
できればこっちでやりたいところなんです。
464:デフォルトの名無しさん
12/02/24 20:20:54.26
大丈夫だ、C++経験者からしてもC++/CLIの習得よりC#の習得の方が楽だから
465:デフォルトの名無しさん
12/02/24 20:21:49.18
/clr:pureだとアセンブリにネイティブコードが混ざらない。
ネイティブコードを混ぜないC++/CLIなんて存在価値ゼロだから、C++/CLI使うんなら常に/clrでおk。
C#をやれ。いくらC++の経験があろうが関係ない。間違いなくC#の方が早く使えるようになるし
開発効率に天と地ほどの差がある。C++/CLIはMSに完全に見捨てられている技術。
466:デフォルトの名無しさん
12/02/24 20:25:20.13
VS2010ではもうインテリセンスすら付けてくれてないもんね
467:デフォルトの名無しさん
12/02/24 21:09:13.08
C#やってみます。
過去のレス見てきたんですけど、ひどい言われようですね
あと、あんま書き込み無いのにレスは早くて面白かったです。
468:デフォルトの名無しさん
12/02/27 08:13:52.05
いろいろと屈折した愛があるからなw
469:デフォルトの名無しさん
12/02/29 02:03:40.75
俺はこのスレに張り付いてるけど一応ちょっと待ってからレスしてるわ
470:デフォルトの名無しさん
12/03/02 07:33:50.86
呼び出し規約がよくわからないのですが、関数を宣言した場所で明示しない場合
・引数・返り値の型にマネージ型が含まれる→__clrcall になる
・含まれない→__stdcall になる。実装がマネージドコードにコンパイルされると、double-thunkingになる
という理解であっているでしょうか。
また、非マネージ型のメンバ関数においては、
managed-code -> __thiscall stub -> __clrcall のような double-thunking が発生するのでしょうか?
471:デフォルトの名無しさん
12/03/07 16:17:15.87
VS11βでもインテリセンス無いかな?
472:デフォルトの名無しさん
12/03/08 00:59:01.93
今ちょっと打ってみたが効くみたいだよ。
473:デフォルトの名無しさん
12/03/13 21:11:04.75
C1001 が出た。
みんな報告してる?
474:デフォルトの名無しさん
12/03/14 04:07:10.11
可能な限りする
475:デフォルトの名無しさん
12/03/14 11:15:03.77
やっぱそうだよな。VS11Betaで試してconnect行くわ。
476:デフォルトの名無しさん
12/03/15 09:53:47.89
VS11betaでもやっぱりIntellisSense効かなくて
"No additional information available"って言われるんだけど
何が悪いんだろう
ButtonとTextBox置いてButtonのイベントハンドラの中で
textBox1->とかやってるだけなんだけど
最初のt打っただけで上のエラーが出て
->まで打ってもエラー出たままでメンバも表示されない
477:デフォルトの名無しさん
12/03/15 20:40:01.46
URLリンク(homepage3.nifty.com)
ここの一番下の図5は図6用の計算式はどの様に記入すれば良いのですか。
478:デフォルトの名無しさん
12/03/16 10:49:25.88
function1のとこだろ
どう考えてもC++/CLIでやるべきことじゃないよなこれ
内容は凄いのに…C#にすれば…
479:デフォルトの名無しさん
12/03/18 11:04:51.87
おお、派手だなw
.net framework 使いたいだけならC#でいいなーほんとに
480:デフォルトの名無しさん
12/03/18 12:14:54.13
eのこと聞いてんのかな?
Math::Exp() にすりゃいいと思うが、、、、
481:デフォルトの名無しさん
12/03/20 20:55:02.08
こういう変に優秀な勘違いがいるからC++/CLIに手を出す奴がいなくならないんだよな
C++/CLIの記事や書籍ってC#やVBに比べて妙に良質だったりするし
482:デフォルトの名無しさん
12/03/21 00:15:02.30
C/C++では配列の終端の一つ次を指すポインタは有効なポインタだったのですけど、
マネージ配列の終端の一つ次を指す interior_ptr は配列がGCで移動したときに正常に更新されますか?
483:482
12/03/25 13:00:47.00
いまさらですが、試してみたところ正常に移動するようでした。
484:482
12/03/26 18:19:27.80
(勝手な推測ですが) interior_ptr はハンドルとオフセットのペアで実装されているのではないかと思います。
array<int> ^a;
auto pa = &a[3]; // { a, 12 }
int *p;
interior_ptr<int> ip (p); // { nullptr, p }
ところで、長さ 0 の配列 (b) に対して &b[0] は IndexOutOfRangeException なんですね…。困った困った。
485:デフォルトの名無しさん
12/03/26 21:59:14.05
配列でinterior_ptrなんて必要?
君が言ってるように常に配列のハンドルとオフセットをペアにしとけばよくね
interior_ptrってクラスのインスタンスフィールド指すのに使うやつでしょ
486:デフォルトの名無しさん
12/03/27 07:37:57.33
既存コードの一部だけマネージに持っていく実験なので。
*& はできても interior_ptr<T>% はできないので、配列 + オフセットの方が便利なのはその通りです。