voidポインタをハンドルへ
今、Form1でlogBoxというTextBoxを作成し、Form1.h以外ののソースからでも、エラーが出た場合そこにLogが吐き出されるようにしようとしています。
//clrres.h
void *LOGBOX;
void OutText(TextBox^ b,String^ s);
extern inline void OUTPUTLOG(String ^s);
//clrres.cpp
#include "stdafx.h"
#include"clrres.h"
void OutText(TextBox^ b,String^ s){
b->AppendText(s+L"\r\n");
b->SelectionStart = b->Text->Length;
b->ScrollToCaret();
}
inline void OUTPUTLOG(String ^s){
OutText((TextBox^)LOGBOX,s);
}
//Form1.hのForm1コンストラクタ内
System::IntPtr ptr=logBox->Handle;
LOGBOX=ptr.ToPointer();
とすれば、簡単に、Logを書き出せるようになるかと考えたのですが、
error C2440: '型キャスト' : 'void *' から'System::Windows::Forms::TextBox ^' に変換できません。
と出てきます。
どの様にすれば、出来るようになるでしょうか?
宜しくお願いします。
No.2ベストアンサー
- 回答日時:
すいません、変換部分は大嘘ぶっこきました。
Control.FromHandleにIntPtrを渡します。
OutText((TextBox^)Control.FromHandle(IntPtr(LOGBOX)),s);
ただし、いずれにせよ例外は発生するはずですので、#1でも言ったようにデリゲートを使うか前回も言ったように例外発生しないように設定を変えるかしてください。
ログを書き込む部分をForm1のパブリックメンバ関数にしてそこからデリゲートを使うようにすれば記述もそう面倒ではないはずです。
たびたび、どうも有り難うございます。
実は、CUIのC++で使っていたヘッダファイルを.NetでGUIを作った場合でも、OUTPUTLOG周りをちょっと書き換えればどっちでも直ぐに使えるヘッダファイルとしてclrres.hを作りたいなと考えているんです。
そこで、Form1に書き込む部分をForm1の中にstatic関数として作成しました。
ただ、これを呼び出そうとすると、clrres.hにForm1.hをインクルードしなければいけません。しかし、Form1.hで使用する関数をclrres.hとclrres.cppで作成していたので、当然Form1.hにもclrres.hがincludeされています。
そのため、どちらかのファイルからもう片方が読み込まれると、読み込まれたファイルもそのファイル自身を読み込んだファイルを読み込もうとします。
しかし、#pragma onceが入っているので、もう片方のファイルに定義されている定義が読み込めずcompileエラーが出ます。
これは、clrres.hに
hogehoge{
class Form1;
void Form1::kakidasi(String^ s);
}
みたいにクラスを前に定義しておくのと同じ感じで書いておけばいけるかなと考えたのですが、このような関数の書き方はだめ、みたいな感じでコンパイラに怒られます。
どの様にすればうまくいくのでしょうか?
No.3
- 回答日時:
そこまで行くともはや別の質問って感じですが……
VC++のデザイナ頼りだとついついヘッダに全部書いてしまいますが、C++/CLIも基本はC++ですからヘッダとコードは分離可能です。
シンボル参照の循環が問題ならそれで解消できるかと思いますが、どうですか?
確かにこの方法でうまく書き込めるようになりました
特にコンソールアプリしか作らなかったころは、voidポインタなんて何に使うのかよく分からなかったですが、色んなライブラリを組み合わせてデータの受け渡しするときには物凄く便利ですね
どうも有り難うございました。
No.1
- 回答日時:
の続きということなのでしょうが、あの例外は「コントロールのオーナー以外がコントロールを操作しようとしている」って事なので、たとえ変換が出来ても結局は同じ例外が発生するだけのはずです。
素直にデリゲートを使ってください。
なお、void *→IntPtrへはIntPtrのコンストラクタを経由して変換可能なので、
OutText((TextBox^)IntPtr(LOGBOX),s);
とすれば文法上の問題はなくなるのではないかと。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- C言語・C++・C# プログラミング実行後の表示される値を答えよ #include<stdio.h> void main( 7 2022/05/20 00:07
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラミング実行後に表示される値を答えよ #include <stdio.h> void main 4 2022/05/28 10:20
- C言語・C++・C# ポインタの型変換、どうやるんでしたっけ? 2 2022/03/28 11:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Notepad++の関数リスト表示の変...
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
C++にてtemplateで受け取った任...
-
戻り値を返す関数の前に(void)...
-
ArduinoでMouse関数を使用して...
-
C++別のオブジェクトからメンバ...
-
合格か否かを表示するプログラ...
-
C#でラジオボタンを設定に記録...
-
C# KeyDownイベントでショート...
-
void*型の配列について
-
C# Controls.Addで動的に配置し...
-
多重定義が起きている?--lnk20...
-
c言語 引数のvoidについて
-
構造体を宣言と共に初期化する方法
-
CTabCtrl:TABインデックス単位...
-
コールバックって・・・
-
静的でないメンバ関数の呼び出...
-
クラス間でのクラスの共有?
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報