• ベストアンサー

2ギガぐらい扱えるデータ型

C作成のDLLから引数で文字列を返すのですが 呼び出し元はVBで引数String型なので 2ギガまで文字列が格納できるのですが Cの方がそのような大きなデータを扱えず 内部エラーになり困っております。 CのDLLは複数の文字列を連続取得して ひとつの文字列にして返すという仕様です。 できたら今の仕様のままいきたいのですが もし他に代替案がありましたら そちらのほうもアドバイスいただきたいとおもいます。

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

  • ベストアンサー
  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。  大胆な仕様ですね笑  malloc で 2Gbyteとれませんか?  32bit環境だったらいけた気がしますが、ちょっと自信はありません。  もしそれが無理ならば、ストリーム形式をとるのが良い感じだと思います。(fopenのようなもの)  例えば、 StrReady; で文字列の送信を用意させ、 StrRead(Buf, sizeof(Buf));といった形で、指定されたバイト数を Bufに格納する。といった形です。  開発する側としては面倒な仕様ですが、後々の事を考えるとこうしておけば柔軟に扱えると思います。  参考になれば幸いです(..

nekosuzu
質問者

お礼

ご回答ありがとうございます。 malloc()または char a[max]で 領域を確保しようとおもいます。 いろいろネットでもみたんですが Cってメモリ管理結構大変なんですね 今まで気にしたことがなかったので びっくりです。 まぁ2Gのデータを扱うことはないとおもいますが VBのStringが2Gまで扱えるということで 書いてみました。 VBより検索パラメタをわたし 実際はCでTCP/IPの電文送受信 その電文のデータ部をひとつにつなげて VBに返すというものを作成しています。 すこしデータ数が多くなるだけでおちるので (現在40k程度でおちてます) もう少し取る方法がないものか 模索しておりましたところです(^^;;; 初Cでソケットはちときついですが(泣き言) もうすこしがんばります 本当にありがとうございました

その他の回答 (2)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.3

将来のことはわかりませんが、現在のパソコンでやるには豪快というようり無茶苦茶な仕様ですね(^^;; そもそも何のためにそんなことをしているのか判らないので、代替案の出し様もありません。 現実的にはファイルを使うのでしょうが、それでも2Gを必要とするような仕様は現実的ではありませんね。 少し前に戻って何をしたいのかをはっきりさせ、 その為にはどういうのが実際使う上で不都合が生じ難いか考え直すべきでしょう。 いえ、お願いですから,そういう無茶な仕様を考えるのは止めてください(^^;;

nekosuzu
質問者

お礼

アドバイスありがとうございます。 実際の連携部の仕様をかいつまんでかきますと VBから検索のパラメタをCのDLLにわたし CのDLLはTCP/IPで電文を送信 クエリ結果がいくつかの応答電文でかえってくるので 応答電文のデータ部をひとつにつなげて VBにかえすというものです 本番データを確認しましたら十分見積もって 150kぐらいあればなんとかいけそうな感じです。 現在45kぐらいで落ちてしまうので もう少し取得できないものかと 模索しておりました。 質問を簡略に書きすぎて 伝わりにくくなってしまって ご迷惑をおかけしました。 本当にありがとうございました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

#1の方と同様、豪快な仕様だと思います。 で、はっきり言って、アウトです。 32bitアプリではメモリ空間は4Gまで使用可能ですが、その中で使用できない分があったりしますので、VBで2G、DLLで2Gなんて事をしたら間違いなくメモリ不足で落ちます。 どうしてもまとめて取りたいのであれば、ファイルに書くのが現実的だと思います。 NTFSでフォーマットされているのであれば、ギガなんて単位よりずっと大きなサイズでも扱えますし。

nekosuzu
質問者

お礼

アドバイスありがとうございます。 たぶん2Gのデータを扱うということは ないので大丈夫だとおもいます (現本番データだと150kぐらい あればいい感じです) 現在45kぐらいでABENDしてるため 困っておりました。 malloc()でとりあえず明示的に 領域を確保してやりたいとおもいます。 いろいろ複雑な処理をしてるので 質問を省略してかこうとして省略しすぎてしまったようで 伝わりにくくてご迷惑をおかけいたしました。

関連するQ&A

  • VBA&c++のデータ受け渡り

    excel VBAを使用し、セルに入っているipアドレスを文字列をc++で作成したDLLファイル内にある関数に引数として渡したいのですが、関数内で確認すると旨く渡っていません。(正しく表示されない) 何か特別な方法やアドバイスが有れば宜しくお願いいたします。 現在の状況は文字列をstringに入れそのアドレスを引数としています。DLL内関数の引数の型はcharのアドレスです。

  • DLLで格納された値をVBに渡す方法

    <VC++で作成したDLLをVBで呼ぶ処理> VBから変数をDLLに渡して値を格納してVBで受け取りたいのですが、 文字列が格納されている先頭アドレスをVBに渡したい場合の 方法を具体的に教えてください。 構造体を使用する方法はできたのですが、使わない方法(引数が変数)を 教えてください。 よろしくお願いします。

  • VBからCで作成されたDLLへの引数の渡し方

    VBからCで作成されたAPI関数への引数の渡し方がわかりません。 C側の引数のデータ型はchar型でポインタ渡しではありません。 ------------------------------------------------ C側 int KANSU(char Mode) VB側 Public Declare Function KANSU Lib "USERAPI.dll" ( ByVal CHAR As Byte) As Long ------------------------------------------------ C側がポインタ渡しの場合は、VB側はSTRING型で別に悩むことはなかったのですが、文字列渡しの場合は、VB側はBYTE型で渡す必要があり、その方法がわかりません。 どなたか、分かる方よろしくお願いします。 ちなみに、VB6.0です。

  • C++型変換について

    C++を始めたばかりの初心者です VBからstringの引数をもらって C++のdllで処理をしてstringを返すものを考えています dll内で処理をするのにstd::stringに変換したいのですが 変換ほうほうがわかりません charをstd::stringへ std::stringをcharへの変換方法を教えてください 宜しくお願いします。

  • VBのメモリのアドレス取得

    C++で作成したDLLをVBから変数を渡して 文字列が格納されているメモリアドレスを取得して、 別のDLLにメモリアドレスを渡したいのですが、 具体的な指定の仕方を教えてください。

  • 【C言語教えて下さい!】文字検索

    引数として、複数の文字列を格納した配列、その文字列数、あるいは文字列aを与え、aが複数の文字列を格納した配列中に見つかれば1を返し、見つからなければ0を返す関数find_string()をつくりたいのですがよくわかりません。 どなたかご教授お願いします。 ヒントや考え方など教えて下さい。

  • VBやC#のDLLを作るとき

    VBやC#のDLLを作るとき特別な作り方があるのでしょうか? 少し前にポインタで文字列ももってき方を教えていただいたのですが、VBやC#に持っていけません C++で特別な作り方があるでしょうか? それともVBやC#で特別な引き込み方があるのでしょうか? 特に文字の場合ポインタがないVBに持っていくとき どういう型で返せばいいのでしょうか? よろしくお願いいたします

  • 関数の引数

    こんにちわ。 ご存知の方、ご教授してもらえないでしょうか? VB.net2005を使っているのですが 関数の引数に変数をセットして、別関数で 引数に対してデータをセットすることは可能でしょうか? C言語でいうところのポインタを引数に渡し ポインタアドレスに書き込むような処理はVB.netでは 可能なんでしょうか? 下記のような事は試したのですが、うまく出来ませんでした(。。; public sub test1() dim mojiretu as string test2( mojiretu ) msgbox(mojiretu) end sub public sub test2( str as string) str = "文字列" end sub

  • アドレスでの参照の仕方

    VB初心者です。 Cは、ポインタ変数にアドレスを入れると、 実態を参照してくれますが、 それをVBでは、どうすればいいのでしょうか?? VBでC関数から文字列が格納されているアドレスを受け取って、 実態の文字列を参照したいのですがどうやったら参照できるのでしょうか?? よろしくお願いします。

  • Cで作成したDLL関数をVBから呼ぶ(.NET)

    以前の質問に「Cで作成したDLL関数をVBから呼ぶ」(QNo.1703839)がありますが、下記のコードを見るとVB6での内容だと思います。 Dim keydata As String * 128 keydata = String$(128, Chr(0) & Chr(0)) VB.NETでVC++のDLLで変更した文字列を受けたいのですが、 どのようにすればよいのでしょうか? VB.NET2003 <DllImport("DllTest.dll")> Private Shared Function _ Test(ByVal s1 As String) As String End Function Private Sub btnTest_Click(...) ... Dim s1 As String = "abc" Dim s2 As String Dim s3 As String s2 = Test(s1) MessageBox.Show(s2) ' "1"が表示される s3 = StrConv(s2, VbStrConv.None) MessageBox.Show(s3) ' 同じく"1"が表示 end sub VC++のDLL extern "C" __declspec (dllexport) BSTR __stdcall Test(char* s1) { AfxMessageBox(s1); // "abc"が表示される OK strcpy(s1, "123"); CString s2; s2 = "123"; return s2.AllocSysString(); } また、文字列に全角を含めても大丈夫でしょうか? Unicodeの変換処理を行う必要があるのでしょうか? よろしくお願いします。

専門家に質問してみよう