• ベストアンサー

VC++でconst void*に渡す

Sqlite3.dllの sqlite3_bind_text16に値を渡したいのですが、 3つ目の引数がconst void*となっているのでtextBox1->Textを渡したいので 適当にいろいろやったのですがよくわかりません。 sqlite3_bind_text16(&stmt,1,,-1,0); 他の引数は一応上のとおりです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

> マーシャルライブラリというのは具体的に > marshal_as<System::String^> > や > pin_ptr<const wchar_t*> > が相当すると覚えて正しいのでしょうか? ANo.2 の参考URLを参照。

ft1711
質問者

お礼

すみません、参考URIは携帯だったのできづきませんでした。 とりあえず、マーシャルライブラリに関する理解度には自信はあまりないですが、ビルドもできて文字化けもありませんでしたので、マーシャルライブラリについては余裕のある時に理解を深めようと思います。 最後までありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.3

> Marshaから何かを使って変換するという事でしょうか マーシャル・ライブラリを使って System::String^ から wchar_t* に変換します。

ft1711
質問者

補足

ありがとうございます マーシャルライブラリというのは具体的に marshal_as<System::String^> や pin_ptr<const wchar_t*> が相当すると覚えて正しいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

そこに渡すのはconst wchar_t*です。 なので System::String^ から const wchar_t* への変換が必要となります。

参考URL:
http://codezine.jp/article/detail/4774
ft1711
質問者

補足

ご回答ありがとうございます。 Marshaから何かを使って変換するという事でしょうか キャストか何かでconst wchar_t*を囲んでSystem::String^の前に書き加えるのでしょうか .toString()みたいなものという認識が正しいのでしょうか すみません、普段char*しか使わないものですから…

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

単にVC++と書かれてますけどC++/CLIではないですか? マネージドコードとアンマネージドコードでのやりとりになるのでMarshalクラス使ってStringをアンマネージドコードの文字列に変換してあげないといけないかと思います。 >3つ目の引数がconst void*となっているのでtextBox1->Textを渡したいので >適当にいろいろやったのですがよくわかりません。 でたらめ(悪い意味での適当)にやって仮にうまく動いたようにみえても、それでわかったことにはならないですよ。 「理由はわからないけど動いてるからOK」は怖いです。

ft1711
質問者

補足

早速ありがとうございます 確かに『::』と入力すると ステータスバー?のような場所には IntelliSense: 'C++/CLI で使用できません' と出ます そもそもC++は過去にgcc(?)でstdと書かずにcoutを使うような本を一冊ざっと読んだ程度で 基本ググって知識と照合しながらコードを書いているのでMSDNやQ&AにあるMarshalを使うソースコードを簡単に理解するレベルではない (MSDNのものはすでにコピーしてビルド失敗しました) ということを考慮してもらえるとありがたいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • constとポインタと引数について

    質問なのですが、 class cParameter { private: A_parameter* parameter; // 構造体A_parameter public: void SetParameter( const A_parameter* temp_parameter){ parameter = temp_parameter; } } この場合 >>parameter = temp_parameter; でエラーを表示されて IntelliSense: 型 "const A_parameter*" の値を型 "A_parameter*" のエンティティに割り当てることはできません ビルドすると error C2440: '=' : 'const A_parameter*' から 'A_parameter*' に変換できません。 と言われます。 引数の形を const A_parameter* temp_parameter ではなく A_parameter* const temp_parameter だと大丈夫なのですが、これだと引数の値を変更できるので私の願望とは違う事になってしまいます。 何か解決策はないのでしょうか。 よろしくお願いします。

  • VC++2005 型についてのエラー

    現在VC++2005でプログラムを作成しています。 そこでテキストファイルに書かれて保存されているものをテキストボックスに表示するというものを作っています。 そして今は、ssという変数にその表示されているものを代入してあります。そこでそのssというものと7:00とテキストファイルに書かれているものを比べてみたいと考えています。 そこでstrcmpで比べてif文を作りたいのですが、下に書いたエラーで変換できませんと出てしまいます。 このような場合はどのように修正すればよいのでしょうか? 基本的な質問かもしれませんがよろしくお願いします。 「'strcmp' : 1 番目の引数を 'System::String ^' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)」 **************************************************************** String^ ss; ss=textBox2->Lines[0]; textBox4->Text=ss; if (strcmp(ss, "7:00")==0) { MessageBox::Show("7時"); } else { MessageBox::Show("それ以外"); } ****************************************************************

  • const参照をポインタ引数として渡すには?

    Aというクラスがあって、BはAを継承しているとします。 そこで、Bのconst参照を返却する以下の関数定義があったとします。 const B& getB() { return b; //bはB型 } さらに次の関数があります。 void C(A* a) { //適当な処理 } ここでCを以下のように呼ぼうとするとコンパイルエラーになります。 C(getB()); Cは引数として型Aを求めていますが、BはAを継承しているので、 そのまま渡しても問題ないと思います。 次に、Cは引数としてポインタを求めているのにgetBの戻り値の参照をそのまま 渡しているからまずいのだと思い、以下のようにしました。 const B& hoge = getB(); C(*hoge); //参照をポインタに変換 しかし、さらに型が違うとエラーになります。 どこがまずいのでしょうか? それと、上では参照をポインタに変換するために変数hogeを宣言していますが、 それを省略して一気にやる方法はないでしょうか? C(*getB()); のようなやり方がしたいのですが。

  • VB6からVCで作成したDLLへのvoidポインタの受け渡し

    VB6でVCで作成されたDLLの関数から戻り値としてvoidポインタを受け取り、 それをDLLの別の関数を呼び出す際に引数として渡すプログラムを作成しようとして 詰まっています。以下サンプルです。 ===VB側 Public Type Param   sStr As String   lNum As Long End Type Declare Function Create Lib "test.dll" (ByRef tParam As Param) As Long Declare Function Free Lib "test.dll" (ByVal pSt As Any) As Long Dim pSt As Long Dim lRet As Long Dim tParam As Param With tParam   .sStr = "test" & Chr(0)   .lNum = 10 End With pSt = Conn(tParam) lRet = Free(pSt) ===VC側 typedef struct stParaA {   char * aaa;   char * bbb; } PARAM_A; typedef struct stParaB {   char * ccc;   int iNum; } PARAM_B; extern "C" void * __stdcall Create(PARAM_B* stParaB) {   PARAM_A stParaA;   //stParaAの各メンバ領域をMallocで確保   return((void*)stParaA); } extern "C" int __stdcall Free(void* stParaA) {   //stParaAの各メンバ領域をfree   return 0; //正常終了の場合 } VC側でデバッグしてみたところ、stParaBの各メンバの値はVC側で取得できているので、 DLLの呼び出し自体には問題はないようですが、Create()でreturnする時と、Free()に 入ってきたときではstParaAのアドレスが変わってしまい、異常終了します。 VC側はソースはあるのでデバッグは可能なのですが、DLLの修正自体は不可となって いるため、VB側を直すしかないのですが、どのようにすればアドレスの受け渡しが できるのでしょうか。

  • (続)エラー「invalid conversion from `void (*)()' to `void (*)(int)'」

    お手数をお掛けしています。 > die の宣言を > void die(int sig); > にしたのであれば, session_loop の中で die を呼出すときにも引数は必要ですよ. > また, 最後の die の定義のところでも引数を取るようにしていますよね? ←念の為. えーと、下記のように static void die(int); : (中略) : signal(SIGINT, die(1)); : (中略) : /* 端末属性を復旧して終わる */ die(1); } : (中略) : static void die(int) { endwin(); /* 端末属性の復旧 */ exit(0); } としてみたのですが $g++ -o server server.c server.c: function 内の `void session_init(int, char, int, int, char, int, int)': server.c:134: void の値が本来の意味通りに無視されませんでした となってしまいました。 何か勘違いしてますでしょうか??

  • TextBoxコントロールを引数として渡すには?

    Public Sub MPlus(txt as TextBox) End Sub という関数があって、この関数に引数としてTextBoxコントロールを渡したいのですが、 Call MPlus(txt_MHantei)や、Call MPlus(Me.txt_MHantei)では、 TextBox.Textの値が引数として渡ってしまい型が違うというエラーが出てしまいます。 どうしたらよいのでしょうか?教えてください。

  • [C++]boostのbindについて教えてください。

    boostのbindについて下記のサイトを参考にしたのですが、よくわからない箇所があります。 1. http://gimite.net/behind/boostsample.htm 2. http://www.kmonos.net/alang/boost/classes/bind.html 1.のサイトに下記のサンプルがあります(一部抜粋)。 struct Boo{  void f(int i, int j)   { std::cout<<"Sum is "<<(i+j)<<"."<<std::endl; } }; void main(){  Boo boo;  boost::function2<void, int, int> func;  func= boost::bind(&Boo::f, &boo, _1, _2); // boo.fを代入  func(13, 7); } とし、func(13,7)の出力結果を20としています。 こちらについては納得できました。 しかし、2のサイトのサンプルがよく分かりません。 こちらでは、boost()を関数の引数にしています。 bool is_ordered( int a, int b, int c ) { return a<=b && b<=c; } int main() {  // 7以上12以下の最初の要素を探す。  // is_orderedに定数をbindして(くくりつけて)、  // 「is_ordered(7,第一引数,12)」と等価な  // 関数オブジェクトを作っているわけです。 int arr[] = {1,2,3,4,5,6,7,8,9,10}; const int len = sizeof(arr) / sizeof(arr[0]); int* f = find_if( arr, arr+len, boost::bind(is_ordered, 7, _1, 12) ); cout << *f << endl;      return 0; } bind()が関数の引数として扱われている場合、_1にはどんな値が入るのでしょうか?(find_if()の第一引数「arr」を_1に代入?) どなたか教えてください。 よろしくお願いいたします。

  • C#で動的に配置したコントロール

    はじめまして 開発歴1年未満の開発者ですがよろしくお願いします。 開発環境 Visual Studio 2008 C# ASP.NET protected void Page_Load(object sender, EventArgs e) { TextBox TextBox = new TextBox(); TextBox.ID = "TextBox1"; TextBox.Text = "C# ASP.NET"; form1.Controls.Add(TextBox); } protected void Button1_Click(object sender, EventArgs e) { string strTextBox1 = ??????? } と上記のように読み込み時に、テキストボックスのみを動的に配置し、デザイナで配置したのボタンを押した際に、テキストボックスに入力された値を、取得したいのですが、方法がわかりません・・・ お忙しいとは、思いますがご回答よろしくお願いします。

  • VC++ スレッドからDoModalへ

    いまさらですがVC++6.0でつまづいています MFCです AdlgクラスのダイアログのOnButtonA() からXXXスレッドを起動し そのXXXスレッドではcountを+1しつづけます。 そして別のダイアログ DDD10をDoModalで起動しそのDDD10 内のTextBoxの値にcount値を反映させて表示しようとしました 下記ソース内のAfxMessageBox(tmp);ではcount値は 更新されますが DDD10ダイアログ内のテキストボックス の値が変更されません m_gui_xfr_totalはDDD10のテキストボックスにつけた メンバー名です どなたかアドバイスをお願いします void ADlg::OnButtonA() { DDD10 dlg10 ; CWinThread *pThread = AfxBeginThread(XXX_thread_entry,(LPVOID *)this); dlg10.DoModal() ; } void XXX_Thread(){ CString tmp; unsigned int count=0; DDD10 dlg10; while(1){ count++; tmp.Format("%d",count); dlg10.m_gui_xfr_total.Format(tmp); AfxMessageBox(tmp); Sleep(1000); } }

  • C#でテキストボックスをクリック→フォームが開く→フォームで設定した値

    C#でテキストボックスをクリック→フォームが開く→フォームで設定した値を元のテキストボックスに入力 こんな感じのことをC#でやりたいのですがよくわからないので教えてください。 1. 親をForm1、子をForm2とします 2. Form1のTextBox1をクリックするとForm2が開いきます 3. Form2で設定した値をForm2の「入力」ボタンを押すとForm2が閉じてTextBox1に値が入力されます というものです。 ここで、textBoxは「クリックしたコントロール名を取得してForm2に渡したい」のです。 テキストボックスがたくさんあるので、textBox1とか決まった名前ではありません。 この部分がわからないのです。 ------------------------------------------------------- Form1: private void textBox1_Click(object sender, EventArgs e) {  Form2 fromItem = new Form2(sender);  DialogResult deRet = fromItem.ShowDialog(); } Form2: public Form2(object sender) {  InitializeComponent();  object pSender = sender; } private void button_input_Click(object sender, EventArgs e) {  ((System.Windows.Forms.TextBox)pSender).text = "hoge"; } ------------------------------------------------------- この程度しかわかりません。 正しい方法を教えてください。よろしくお願いいたします。