5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++/CLI について語ろうぜ Part2

1 :デフォルトの名無しさん:2006/03/12(日) 16:08:39
おそらく、.NET開発でデファクトスタンダードに最も近い
であろうC++/CLIについて語ろうぜ!

このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。
.NETのクラスライブラリの使い方といった質問は姉妹スレ「くだすれC++/CLI(初心者用)」に
お願いします。

前スレッドはこちら
(p)http://pc8.2ch.net/test/read.cgi/tech/1126450441/l50

姉妹スレ
くだすれC++/CLI(初心者用)
(p)http://pc8.2ch.net/test/read.cgi/tech/1142144110/l50
managed C++ やろうぜ!! 002
(p)http://pc8.2ch.net/test/read.cgi/tech/1139043535/l50


153 :デフォルトの名無しさん:2006/08/10(木) 00:00:25
>>152
>MSDN ライブラリ > .NET 開発 > .NET Framework SDK > MFC リファレンス
うは、ほんとだwww

154 :ヽ(゚∀。)ノうぇね ◆xOFicusMP. :2006/08/26(土) 23:01:19
あまり使ってる人もいないんだろうけど、ごめん、鯖が消えてた(´・ω・`)
引っ越したので、こちらを参照してください

ECMA-372仕様書
ttp://mdjowbnb.sv05.fsdotnet.net/ecma372/StartingState.aspx


155 :デフォルトの名無しさん:2006/08/27(日) 17:51:15
>>154
乙です。お世話になってます。

156 :デフォルトの名無しさん:2006/09/05(火) 18:17:53
C++/CLI で作ったクラスライブラリって、CLR Profiler 通る?
CLR Profiler いつも落ちるんだけど。

157 :デフォルトの名無しさん:2006/09/08(金) 00:40:07
/clr:pure 状態でも?

158 :デフォルトの名無しさん:2006/09/08(金) 11:33:09
/clrでコンパイルしたときにアンマネージコードの生成が

『〜〜用にネイティブ コードの生成が発生します』
と自動的に適用される場合と、

『この関数はマネージとしてコンパイルできません。#pragma をアンマネージで使用してください』
と明示しなければエラーになる場合があるんだけど、

両者の違いって分る人居ますか?

159 :デフォルトの名無しさん:2006/09/14(木) 00:40:15
ISOは賢明な判断をしたな

160 :デフォルトの名無しさん:2006/09/14(木) 01:05:14
>>159

くわしく。

161 :デフォルトの名無しさん:2006/09/14(木) 08:25:11
これか
ttp://blogs.wankuma.com/episteme/archive/2006/09/12/38394.aspx

162 :デフォルトの名無しさん:2006/09/14(木) 08:27:22
これかな?
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=42926

163 :デフォルトの名無しさん:2006/09/14(木) 08:31:29
間違えた orz
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=43913&scopelist=PROGRAMME

164 :デフォルトの名無しさん:2006/09/14(木) 08:52:40
ま、駄目だった物は駄目、ということで

165 :デフォルトの名無しさん:2006/09/14(木) 09:03:55
まあ駄目で当然という気がする。
仕様が汚すぎる。上位互換じゃないのも(C++を名乗るには)問題。

166 :デフォルトの名無しさん:2006/09/14(木) 13:57:57
ちょっとホッとした。本当に賢明な判断だ。


167 :デフォルトの名無しさん:2006/09/15(金) 01:56:05
どっちの味方なんだよ

168 :デフォルトの名無しさん:2006/09/15(金) 02:18:45
最終的にまともなのになってくれれば過程はどうでもい

169 :デフォルトの名無しさん:2006/09/15(金) 04:19:04
C++をマネージ拡張するのもいいんだけど、
C#をアンマネージ拡張して欲しいと思うときがある。
まあ、DllImportすればいいんだけど。

170 :デフォルトの名無しさん:2006/09/16(土) 01:34:15
よくねーよ。
でもMSが持ってるNativeMethods.cs公開してくれたら、それでいい気がする。

171 :デフォルトの名無しさん:2006/09/16(土) 01:44:50
俺もそれほしい
PInvoke.net が不要になっちゃう

172 :デフォルトの名無しさん:2006/09/16(土) 02:03:51
結局、/CLIは今のところ使わない方が良いって事だなぁ…。


173 :デフォルトの名無しさん:2006/11/18(土) 10:46:54
sage

174 :デフォルトの名無しさん:2006/11/19(日) 03:51:20
C++/CLIって結局微妙ってこと?
@IT:特集:Visual C++ 2005 いままたC++が熱い!「C++/CLI」として大進化したVisual C++ 2005
http://www.atmarkit.co.jp/fdotnet/special/cppcli/cppcli_01.html
これとか見ると随分興奮しているけど

175 :デフォルトの名無しさん:2006/11/19(日) 12:02:38
>>174
ヒント: 川俣 晶

176 :デフォルトの名無しさん:2006/11/20(月) 16:15:43
海外だと、C++/CLIは凍るほど冷えてる。


177 :デフォルトの名無しさん:2006/11/20(月) 19:51:22
>>176
そうなんかぁ〜?

178 :デフォルトの名無しさん:2006/12/03(日) 02:17:55
DllImport関係のNativeMethod系以外に結局何が素敵なの? C++/CLIって
>>145
(言語熟練度はプロジェクト要員の平均レベルでC++/C#ができるものとして)
Manageなコード中に簡単にネイティブっぽいものが書けちゃうと逆にメンテし辛いものにならないのかな。

ところで、C++/CLIってC#3.0みたいな機能って予定されてるの?

179 :デフォルトの名無しさん:2006/12/03(日) 03:11:41
ネイティブの方が圧倒的に多かったり、
XP用のポーティングをしたり、
いろいろ便利なケースは想定できるでしょ?

どこまで厚くサポートされるかは分からない。
STL.NETみたいに辞めちゃったプロジェクトもあるし、
C++/CLIの人員削減はあり得ることだと思う。

180 :デフォルトの名無しさん:2006/12/03(日) 08:56:56
STL.NETはやめてはいないだろ。
OrcasのCTPにSTL/CLRが入っている。
どんなもんかまだ俺は試していないけど。

181 :デフォルトの名無しさん:2006/12/04(月) 15:49:06
void func (String* str1, String* str2, String* str3) {
  String* str;
  str = System::String::Concat( str, str1 );
  str = System::String::Concat( str, '\0' );
  str = System::String::Concat( str, str2 );
  str = System::String::Concat( str, '\0' );
  str = System::String::Concat( str, str3 );
  str = System::String::Concat( str, '\0' );
  str = System::String::Concat( str, '\0' );
}

func("aaa","bbb","ccc");

上記で、"aaa\0bbb\0ccc\0\0"という値を期待していたのですが、\0が消えて"aaabbbccc"となってしまいます。
助けてください

182 :181:2006/12/04(月) 15:57:05
void fucn(string a, string b, string c) {
  string ret = "";
  ret = System.String.Concat( ret, a );
  ret = System.String.Concat( ret, '\0' );
  ret = System.String.Concat( ret, b );
  ret = System.String.Concat( ret, '\0' );
  ret = System.String.Concat( ret, c );
  ret = System.String.Concat( ret, '\0' );
  ret = System.String.Concat( ret, '\0' );
}
func("aaa","bbb","ccc");

あと、C#で上記のようにやった場合は期待通りの値になっているようです。
本当はC#で全部やろうと思ったのですが、C#でWin32APIの呼び出しが解らなくてC++/CLI使ってみました。
そのAPIの引数が、"aaa\0bbb\0ccc\0\0"という形式で指定しろとなっているのですが、
今度は引数が生成できなくて填ってます。

183 :デフォルトの名無しさん:2006/12/04(月) 16:07:42
>>182
やったこと無いんだが、
見た感じ、strcatと同じ動作に見えるね。

オペレータの+ってないの?

184 :デフォルトの名無しさん:2006/12/04(月) 16:18:11
>>183
ret += a;
今、上記のようにやってみたのですが、下記のエラーになってしまいました。。。

error C2297: '+=' : 無効な右オペランドです。
error C2845: '+=' : __gc ポインタ 'System::String __gc *' に対してポインタ演算ができません。


185 :デフォルトの名無しさん:2006/12/04(月) 16:47:32
CLIは素人なのではずしてたらごめんね。
で、これ通ったよ。

using namespace System;

int main(array<System::String ^> ^args)
{   
    String^ A="Hello";
    String^ B="World";
    String^ C="";
    C=A+B;
    Console::WriteLine(C->ToCharArray());
    return 0;
}

と、ここまで書いて見落とし発見・・・。
なんだ、普通のstd::stringか?
ちょっとまってて。

186 :181:2006/12/04(月) 17:03:45
皆さん、ありがとう。
下記のようにして何とか動きました。

voidfunc(String*str1,String*str2,String*str3){
 LPTSTRpArg;
 LPTSTRpStr1=(LPTSTR)Marshal::StringToHGlobalAnsi(str1).ToPointer();
 LPTSTRpStr2=(LPTSTR)Marshal::StringToHGlobalAnsi(str2).ToPointer();;
 LPTSTRpStr3=(LPTSTR)Marshal::StringToHGlobalAnsi(str3).ToPointer();;

 intlen=0;
 len+=lstrlen(pStr1);
 len+=1;
 len+=lstrlen(pStr2);
 len+=1;
 len+=lstrlen(pStr3);
 len+=1;
 len+=1;

 pArg=(LPTSTR)malloc(len);

 len=0;
 memcpy(&pArg[len],pStr1,lstrlen(pStr1));len+=lstrlen(pStr1);
 memcpy(&pArg[len],"\0",1);len+=1;
 memcpy(&pArg[len],pStr2,lstrlen(pStr2));len+=lstrlen(pStr2);
 memcpy(&pArg[len],"\0",1);len+=1;
 memcpy(&pArg[len],pStr3,lstrlen(pStr3));len+=lstrlen(pStr3);
 memcpy(&pArg[len],"\0",1);len+=1;
 memcpy(&pArg[len],"\0",1);len+=1;

 func(pArg);
 free(pArg);
}

187 :デフォルトの名無しさん:2006/12/04(月) 17:04:51
ミスった・・・

voidfunc(String*str1,String*str2,String*str3){
 LPTSTR pArg;
 LPTSTR pStr1=(LPTSTR)Marshal::StringToHGlobalAnsi(str1).ToPointer();
 LPTSTR pStr2=(LPTSTR)Marshal::StringToHGlobalAnsi(str2).ToPointer();;
 LPTSTR pStr3=(LPTSTR)Marshal::StringToHGlobalAnsi(str3).ToPointer();;

 int len=0;
 len+=lstrlen(pStr1);
 len+=1;
 len+=lstrlen(pStr2);
 len+=1;
 len+=lstrlen(pStr3);
 len+=1;
 len+=1;

 pArg=(LPTSTR)malloc(len);

 len=0;
 memcpy(&pArg[len],pStr1,lstrlen(pStr1));len+=lstrlen(pStr1);
 memcpy(&pArg[len],"\0",1);len+=1;
 memcpy(&pArg[len],pStr2,lstrlen(pStr2));len+=lstrlen(pStr2);
 memcpy(&pArg[len],"\0",1);len+=1;
 memcpy(&pArg[len],pStr3,lstrlen(pStr3));len+=lstrlen(pStr3);
 memcpy(&pArg[len],"\0",1);len+=1;
 memcpy(&pArg[len],"\0",1);len+=1;

 func(pArg);

 free(pArg);
}

188 :デフォルトの名無しさん:2006/12/04(月) 17:10:58
>>181お前それC++/CLIではなく、マネージドC++だろ。
とりあえず、こうすると.NET 2003の/clrと2005の/clr:OldSyntaxで動く(実行するとaaaしか表示されない)。
#using <mscorlib.dll>
#include <vcclr.h>
#include <windows.h>
#pragma comment(lib, "user32.lib")
void func (System::String* str1, System::String* str2, System::String* str3) {
  using System::String;
  String* str;
  str = String::Concat(str, str1);
  str = String::Concat(str, S"\0");
  str = String::Concat(str, str2);
  str = String::Concat(str, S"\0");
  str = String::Concat(str, str3);
  str = String::Concat(str, S"\0");
  str = String::Concat(str, S"\0");
  const wchar_t __pin* p = PtrToStringChars(str);
  ::MessageBoxW(0, p, L"", MB_OK);
}
int main()
{
  func("aaa","bbb","ccc");
}
まあAPIの相手をするならchar配列のほうが楽。
>>187 せめてsprintf使え。あとLPTSTRをマルチバイト文字列に使うな。

189 :デフォルトの名無しさん:2006/12/04(月) 17:11:03
こらこら、ANSI文字列のポインタをLPTSTRで受けちゃダメだぞ。

190 :デフォルトの名無しさん:2006/12/04(月) 17:14:53
…なんだか口は悪いけど親切なお兄さんと結婚することになりそうです。

191 :188:2006/12/04(月) 17:22:28
>>188
動きました!

192 :181:2006/12/04(月) 17:22:51
名前欄まちがえた

193 :デフォルトの名無しさん:2006/12/04(月) 17:30:11
あと、Marshal::StringToHGlobalAnsiで確保したメモリを開放していないな。

方法は幾通りもある。あんマネージ文字列への変換はCString (ATL/MFC 7以上)使うのと結構楽。
TCHARも適当にやってくれるし。
#using <mscorlib.dll>
#include <atlstr.h>
#include <windows.h>
#pragma comment(lib, "user32.lib")

void func (System::String* str1, System::String* str2, System::String* str3)
{
  using ATL::CString;
  CString cs1(str1), cs2(str2), cs3(str3);
  CString arg;
  arg.Format(TEXT("%s\0%s\0%s\0"), static_cast<PCSTR>(cs1), static_cast<PCSTR>(cs2), static_cast<PCSTR>(cs3));

  ::MessageBox(0, arg, TEXT(""), MB_OK);



194 :185:2006/12/04(月) 17:37:49
>>186-188
ほかの方法があったか。
色々考え出したら止まらなくって困ってたとこだった。
役に立てなくてすまない。

#include <string>
#include <iostream>
int main(array<System::String ^> ^args)
{
    std::string A="BMP",B="Wav";
    std::string C="";
    
    C=A+'\0'+B+'\0'+'\0';
    std::cout<<C<<std::endl;
    //std::cout<<C.c_str()<<std::endl;

    return 0;
}

こういう感じの想定してた。@VC2005EE

195 :デフォルトの名無しさん:2006/12/04(月) 17:44:41
>>193の方法は短いですけど、>>188の方が見やすそうなので、使わせてもらいました。
色々勉強になりました

196 :デフォルトの名無しさん:2006/12/04(月) 17:56:57
CLIだが最終的にこんなんなった。

std::string func(String^ str1, String^ str2, String^ str3)
{
    IntPtr ptr1 = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str1);
    IntPtr ptr2 = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str2);
    IntPtr ptr3 = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str3);

    std::string result = std::string()
        + reinterpret_cast<const char *>(ptr1.ToPointer()) + '\0'
        + reinterpret_cast<const char *>(ptr2.ToPointer()) + '\0'
        + reinterpret_cast<const char *>(ptr3.ToPointer()) + '\0'
        + '\0';

    System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr1);
    System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr2);
    System::Runtime::InteropServices::Marshal::FreeHGlobal(ptr3);

    return result;
}


197 :デフォルトの名無しさん:2006/12/04(月) 18:23:57
>>195
せめてStringBuilder使え。

198 :デフォルトの名無しさん:2006/12/04(月) 23:45:05
ふつうに wstring 使った方が早くね?

199 :デフォルトの名無しさん:2006/12/04(月) 23:49:36
String::Format 使えばいいと思う……

200 :デフォルトの名無しさん:2006/12/05(火) 00:23:34
>>199
>>193で出たものの、>>195で却下された。

201 :デフォルトの名無しさん:2006/12/05(火) 11:03:39
個人的には(作成理由から読むに) C# で DLLImport の方法を探した方が遥かに楽だったんじゃないかという気がするけど。

色んな選択肢を使える懐の深さが C++/CLI の一つの魅力なわけだし、
最速/高効率よりも、本人が理解/吸収しやすい手法を取るのが最良だと思う。

202 :デフォルトの名無しさん:2006/12/05(火) 16:10:02
さすがに、それを最良と言い切るのはおかしいな。
言いたいことはわかるが、言葉の選択を誤ってるね。


54 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)