VBの「As String * 128」とは?

このQ&Aのポイント
  • VBの「As String * 128」とは、Visual Basic 2010 Expressでコンソールアプリケーションを作成する際に使用される記述です。
  • 「* 128」とは、文字列の長さを指定するための記法で、128文字のメモリを確保し、文字列を格納することを示します。
  • エラーを解決するためには、szCSDVersionの宣言部分を修正し、文字列の長さなしで宣言する必要があります。
回答を見る
  • ベストアンサー

VBの「As String * 128」とは?

VBの「As String * 128」とは? Visual Basic 2010 Expressでコンソールアプリケーションを作成しています。 OSのヴァージョンを取得する機能を作成したかったので、 http://hanatyan.sakura.ne.jp/vbhlp/Version.htm を参考にして、OSVERSIONINFOの構造体を定義しました。 しかし szCSDVersion As String * 128 の 「* 128」 の部分で、ステートメントの終わりを指定してくださいとエラーが出ます。 「* 128」とは、いったいどういう意味ですか? また、エラーを無くす方法はありますか? いろいろ検索しましたが、調べ方が悪いのか、分かりませんでした。 よろしくお願いします。

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

  • ベストアンサー
  • g_liar
  • ベストアンサー率52% (382/728)
回答No.2

参考にされたサイトはVB6.0用のソースですね。 VB6.0とVB2010(=VB.NET)は色々な部分が変わってますので、VB.NET用のサンプルを見た方が良いと思います。 http://dobon.net/vb/dotnet/system/osversion.html ちなみに一応、質問に答えると… > 「* 128」とは、いったいどういう意味ですか? VB6.0(VB2010の5世代前のバージョン?)で固定長文字列を表す定義です。 * 128と記述すると128文字以上の文字列を入れても自動的に128文字でカットされます。 > また、エラーを無くす方法はありますか? VB2010(=VB.NET)では以下のように記述します。 <VBFixedStringAttribute(128)> Private szCSDVersion As String

rigard1225
質問者

お礼

ご回答ありがとうございます。 「* 128」の意味などが分かりました。 勉強になりました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

極く旧い時代のBasic(VB Basicよりずっと前の当初の、特にビジネスで使うBasic)時代から、文字列の長さを許容長以下で定義するとき、ありました。文字列長を指定するものです。構造体と言う考えは無いが、私の使っていたものは、ビジネス向けだったのでたしか Recdef simei*16 jyusho*60 keisuu Recend などとフィールド長を定義して、レコードを読むと、このインプトエリアに読み込んでくれました。 具体的な文字列を代入すると、その長さを超えない文字列が左詰めでセットされたように記憶する。 ーー VB6->VB.NETでは http://msdn.microsoft.com/ja-jp/library/f47b0zy4(VS.80).aspx http://msdn.microsoft.com/ja-jp/vbasic/cc707243.aspx#User-Defined のユーザー定義型記憶領域の固定長文字列。 VB6からVB.NET移行の際の、大きなテーマ(修正項目)の1つのようです。

rigard1225
質問者

お礼

ご回答ありがとうございます。 詳しいご説明で、とても勉強になりました。

回答No.3

Win32APIを利用しなくてもNET Frameworkにあるみたいです。 http://dobon.net/vb/dotnet/system/osversion.html > System.Environment.OSVersion Win32APIを利用して取得する方法も同じページに記されているので、 下手にVB6用のページを参照するより、こちらを見たほうが分かり易いと思います。

rigard1225
質問者

お礼

ご回答ありがとうございます。 Win32APIは難しそうなので、変える方向で検討いたします。

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.1

お調べのページは、コメントに記述してあるとおり「VB6.0」のソースです。 ~As String * 128 というのは、VB6.0の時代にあった「固定長(この場合は128バイト)の文字列型」です。 VB2010では固定長はサポートされていません。そもそも、VB2010でAPIを使う事自体がナンセンスです。 OperatingSystemオブジェクトで調べるべきでしょう。 http://dobon.net/vb/dotnet/system/osversion.html

rigard1225
質問者

お礼

ご回答ありがとうございます。 Vb6.0の機能がVb2010でも使えるわけではないのですね。 見当違いなところを探していたようです。

関連するQ&A

  • VB6.0のString関数に代わるVB2008のそれは?

    2009年1月27日にVB 2008Expressをダウンロードしたばかりの初学者です。 ですから、色々とわからないことだらけです。 で、今回は VB6.0のString関数に代わるVB2008のそれ。 ? String(12, "*") ************ Function Strings(ByVal C As Char, ByVal L As Integer) As String   Return Space(L).Replace(" ", C) End Function 少しは探しましたが、適当なのがなくてStrings関数を作成してしまいました。 2週間程度の初学者。 しかも、文字列関連のヘルプは昨日に初めて紐解いたばかり。 ですから、「適当なのがない」との判断はかなり怪しいものです。 そこで、「VB6.0のString関数に代わるVB2008のそれは、これですよ!」という回答をお願いします。

  • VB6では、Applicationは未定義なのでしょうか?

    VB6を使ってプログラムを書いているのですが、以下のソースの部分で エラーになりました。 Dim winname As String winname = Application.Caption <-- Applicationが未定義?  コンパイルエラー 変数が定義されていません。 というエラーメッセージが表示されます。 VB6では、Applicationは未定義なのでしょうか?

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • VBのString型の配列をVCで受け取るには?

    VBでString型の配列として定義されている変数を VCのプログラムで受け取るにはどうすればよいのでしょうか? 試しにVBでString型の配列を作って DLLのC_TESTというファンクションを呼び出すという 処理を作ってみたのですが、コンパイルエラーになってしまいます。 なにかおかしいところありますか? そもそもVCにはString型ってないんですよね? プログラミング初心者ですので、変な言葉遣いに なってるかもしれませんが宜しくお願いします。 VB Declare Function C_TEST Lib "\test.dll" (ByVal data() As String) As Integer Dim A(1) As String dim rtn as Integer A(0)="あああ" A(1)="いいい" rtn= C_TEST(A) VCのプログラム int _stdcall C_TEST(LPSTR A[2] ){ AfxMessageBox( A[0] ); return(0); }

  • 命名規則 VB 構造体

    VBの構造体の命名はどうすればいいですか? strXXX as string intYYY as integer ???ZZZ as 構造体 udtZZZ as 構造体 でいいのでしょうか? ユーザー定義型ということでいいのでしょうか?

  • VB2008ExpressのソースをVB2005Expressで動かしたい

     VB2008Expressでソフト作成していましたが、Windows2000でも動かす必要が発生し、VB2005Expressに環境を変更(ダウングレード?)しました。VB2008ExpressがWindows2000に対応していないというのに気がつきませんでした。  すると、VB2008Expressで作成していたソリューションファイルが開きません。以下のエラーが表示され、それで終わりです。 『選択されたファイルはソリューションファイルですが、このアプリケーションより新しいバージョンで作成されたため、開くことができません。』  何らかの方法でVB2008Expressのソース一式をVB2005Expressで利用することはできないでしょうか? (実行形式のファイルだけでなく開発環境そのものからWindows2000で動かす必要に迫られています。)  VB2008ExpressとVB2005Expressとで、相互に使える必要はないです。一旦VB2005Expressに持って行ければ、それはそのままでOKです。  作成したソフトはそう大規模なモノはないので、方法がなければベタですが、一から作り直そうかと思ってます。

  • VB.NET DLL 参照型String読込み

    VCで作成されたDLLの参照型Stringの読込みに困っております。 ご存じの方、お教え下さい。 VB6では次のような定義で、問題なく実行できます。 Private Declare Function VcToVb _ Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Long, _ ByRef strData As String, ByRef Err_Cnt As Long, ByRef Err_DATA As String) As Long ------------------------------------ Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) これを VB.NETで実施 Private Declare Ansi Function VcToVb _  Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Int32, _ <MarshalAs(UnmanagedType.LPStr)> ByRef strData As StringBuilder, _ ByRef err_cnt As Int32, ByRef Err_DATA As StringBuilder) As Int32 (テストのため、strDataのみ) -------------------------------------- Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) ******************************************* 調べた結果、VB.NETでは参照型は簡単にはいかないみたいで、StringBuilderを使用するとか、色々な方法を試しました。 結果は戻ってくるのですが、問題は DLLが文字列を返すときに、文字列内の項目区切文字として chr(0)を設定します。 このため、結果は Chr(0)の前までしか設定されません。 (VB.NETが Chr(0)を文字列の最後と判断する?) これを解決する方法はありますでしょうか。 現在は VB6で呼出す DLLを作成し、VB.NETはこれを使用していますが、 C#.Netならできるのでしょうか。 よろしくお願い申し上げます。

  • VisualBasic6からVB2005に移行に難儀しています。

    .NETが流行りだした時期にパソコンから遠ざかっていましたので、昔作成したVB6のアプリケーションをVB2005に書き直そうと大それたことを考えています。 VB6のソースをVB2005に自動的に書き直すVisualBasic アップグレードウィザードで変換しましたが、案の定、変換エラーだらけでした。 Public easy(5) As Boolean等はそのまま変換していますが、Typeでユーザー定義型を作成した配列は、 以下のようにVB6だけの知識では理解不能な書き換えや説明が付加されていました。 StructureはTypeの意味だとわかりますが、<VBFixedArray((10))>や 変数を初期化する必要があるなど、どのタイミングで初期化する (追加記述しなければいけない部分が何なのか)わかりません。 また、ステートメントやメソッド?が異なる(アップグレード)されたとか 詳細についてクリックしてくださいとありますが、クリックしても無反応でした。 Structure AruKata Dim num As Byte <VBFixedArray((10))> Dim pos() As Byte 'char 'UPGRADE_TODO: この構造体のインスタンスを初期化するには、"Initialize" を呼び出さなければなりません。 ... Public Sub Initialize() ReDim pos(10) End Sub End Structure 'UPGRADE_WARNING: 配列 AruKata で各要素を初期化する必要があります。 詳細については... Public difficult(8) As AruKata このようにVB6からVB2005に移行するにあたって、よく説明している書籍など(あるのかな?)ありましたら教えてください。

  • VB6でコンソールアプリケーションを作りたい

    タイトルの通りですが、 VB6でコンソールアプリケーションを作るには、どのようにすればよいのでしょうか。VB.NETの場合は、新規プロジェクトを作成するときに、コンソールアプリケーションが選べましたが、VB6の場合は該当するものが見あたりませんでした。ご存じの方おりましたら、教えて下さい。

  • バイト配列の構造体変換について

    TCPの通信アプリケーションをて作成しています。 Recvbuff(1024) as byte と定義した変数に受信したデータを格納し以下のような構造体に格納 したいのです。 構造体A id as integer Usercode as string Username as string Filename as string このとき、共用体のような使いかたはVBではできないようなので すが、このような場合 整数なら「Recvbuff(1) * 256 + Recvbuff(0)」のように計算する。  文字列なら必要な文字のみ切り取ってGetStringで変換する。 といった方法しかないのでしょうか。 環境は VS2008 VB.NET です。