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); }
[実行結果] さぁ〜て、これを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
[実行結果]
こんなこともできるよ!! 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
[実行結果] 上記サンプルは半角アルファベットしか使ってないので、「日本語を使用すると文字化けするんじゃないの?」というツッコミを受けてしまいそうであるが、日本語でもバッチリ動くのでご安心ください。 |