● VB でポインタ ●

Visual Basic 5.0でポインターを扱おうという全く無謀な試みをここでやっちゃおうかな。ま、取りあえず、下のC言語のコードを見てよ。
[備考] 文字列のポインタからVB用文字列に復元するも合わせて参照するとよいかもね。

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
    char srcBuff[]="This is a Sample.";
    char extBuff[256+1];
    char *strPointer;

    /* ポインタコピー */
    strPointer=&srcBuff[0];

    /* ポインタを1つ進める */
    strPointer++;

    /* 文字列コピー */
    strcpy(extBuff, strPointer);

    printf("%s\n", extBuff);

    return(1);
}

[実行結果]
his is a Sample.

さぁ〜て、これをVBでやるには…、以下のことをしなければならないのかな。


@文字コードを Unicode から ANSI コードに変える
A文字列の先頭のアドレスを取得する
BC言語の strcpy と同様の関数を用意する

@に関しては VBには StrConv という関数があるので問題はない。Aに関しても StrPtr という隠し関数があるので問題なし。Bに関しては lstrcpy API関数があるので問題はないが、使用上ちょっと問題があるかな。この関数の第2引数は String 型なんだよね。ここにアドレスを渡さなければいけないから、データ型を Long 型に書き換えてあげる必要があるね。と、ここまで書き立てればソース見れば分かるでしょ。

Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long

Private Sub Command1_Click()

    Dim strPointer As Long
    Dim srcBuff As String
    Dim extBuff As String * 256
    Dim GotStr As String

    '適当な文字列
    srcBuff = "This is a Sample." & Chr$(0)

    'Unicode → ANSI 文字列変換
    srcBuff = StrConv(srcBuff, vbFromUnicode)

    'ポインタを1つ進める
    strPointer = StrPtr(srcBuff) + 1

    '文字列コピー
    Call lstrcpy(extBuff, strPointer)

    'Nullカット
    GotStr = Left$(extBuff, InStr(extBuff, Chr$(0)) - 1)

    Debug.Print GotStr

End Sub

[実行結果]
his is a Sample.


こんなこともできるよ!! lstrcpy の第1引数が Long 型であるのに注目。

Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long

Private Sub Command2_Click()

    Dim strPointer As Long
    Dim srcBuff As String
    Dim extBuff(256) As Byte
    Dim extBuffPointer As Long
    Dim GotStr As String

    '適当な文字列
    srcBuff = "This is a Sample." & Chr$(0)

    'Unicode → ANSI 文字列変換
    srcBuff = StrConv(srcBuff, vbFromUnicode)

    'ポインタを1つ進める
    strPointer = StrPtr(srcBuff) + 1

    'byte型変数のポインタを取得
    extBuffPointer = VarPtr(extBuff(0))

    '文字列コピー
    Call lstrcpy(extBuffPointer, strPointer)

    'ひとまずANSIからUnicodeに変換
    GotStr = StrConv(extBuff, vbUnicode)

    'Nullカット
    GotStr = Left$(GotStr, InStr(GotStr, Chr$(0)) - 1)

    Debug.Print GotStr

End Sub

[実行結果]
his is a Sample.

上記サンプルは半角アルファベットしか使ってないので、「日本語を使用すると文字化けするんじゃないの?」というツッコミを受けてしまいそうであるが、日本語でもバッチリ動くのでご安心ください。


戻る