tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルUnicode変換について
記事No1150
投稿日: 2004/11/05(Fri) 11:10
投稿者Hamiltonian
[OSのVer]:Windows XP Pro  [VBのVer]:VB.NET

現在VB6→VB.NETのバージョンアップを行っています。
バージョンアップに伴う数ある変更点のひとつに、
StrConv([文字列],vbUnicode)の定数「vbUnicode」が
サポートされていないというのがあります。
これと同様のことを.NETでするにはどうしたらよいのでしょうか?

いろいろ調べてみたのですが、上記関数は文字列を無理やり
Shift_JISとみなしUnicodeに変換しているらしいので
以下のようなコーディングをしてみたのですがうまくいきません。


Dim strString As String = "aaa"
Dim encJIS As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS"
)
Dim encUni As System.Text.Encoding = System.Text.Encoding.Unicode
'Unicodeバイト配列の取得
Dim byt1() As Byte = encUni.GetBytes(strString)
'Shift_JISとみなしUnicodeに変換?
Dim byt2() As Byte = System.Text.Encoding.Convert(encJIS, encUni, byt1)
'バイト配列を文字列に変換
strString = System.Text.Encoding.Unicode.GetString(byt2)


これだとバイト配列は正しく取得できているようなのですが
最後の文字列が正しく取得できません(1文字しか取れない)。
.NETは初めて使うのでコーディングにも戸惑っている状態です。
よいアドバイスをよろしくお願いします。

[ツリー表示へ]
タイトルRe: Unicode変換について
記事No1152
投稿日: 2004/11/06(Sat) 09:33
投稿者花ちゃん
ここのTips一覧の文字列操作関係では参考になりませんか?

最終的に何が取得したいのか ?? ですが、元々のVB6.0 のコードはどのような
ものだったのでしょうか?

[ツリー表示へ]
タイトルRe^2: Unicode変換について
記事No1155
投稿日: 2004/11/08(Mon) 09:27
投稿者Hamiltonian
[OSのVer]:Windows    [VBのVer]:VB.NET  

お返事ありがとうございます。

> 最終的に何が取得したいのか ?? ですが、元々のVB6.0 のコードはどのような
> ものだったのでしょうか?

元の関数はユーザーがAdministrator権限を持っているかを判定するもので、
APIのNetUserGetLocalGroups関数を使用しています。
この関数はサーバー名とユーザー名の引数をUnicodeで渡さなければならず、
StrConv関数を使用していました。
それともほかにこのAPI関数を使わずに、Administrator権限を判定できる方法があるのでしょうか?

[ツリー表示へ]
タイトルRe^3: Unicode変換について
記事No1156
投稿日: 2004/11/08(Mon) 10:31
投稿者魔界の仮面弁士
> APIのNetUserGetLocalGroups関数を使用しています。
> この関数はサーバー名とユーザー名の引数をUnicodeで渡さなければならず、
> StrConv関数を使用していました。

VB6で Unicode を渡すなら、StrConv を使うのではなく、Declare側を
Private Declare Sub foo Lib "dllname" (ByRef x As Byte)
などのように、Byte型に対する参照で宣言しておき、
  Dim B() As Byte
  B = "文字列"
  foo B(0)
のように呼び出す方が良いかと。


で、VB.NETの場合は、宣言時に Auto / Unicode / ANSI にて文字列の扱いを明示できるので、
Private Declare Unicode Sub foo Lib "dllname" (ByVal x As String)
のように、Unicode修飾子を指定しておけば、
  Dim S As String = "文字列"
  foo(S)
といった感じで、String型をそのまま渡す事が可能かと思います。


> それともほかにこのAPI関数を使わずに、Administrator権限を判定できる方法があるのでしょうか?

これで良いのかな…。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If Array.IndexOf(GetRoles(), "BUILTIN\Administrators") >= 0 Then
        MessageBox.Show("管理者権限があります。")
    Else
        MessageBox.Show("Administratorsグループのメンバではありません。")
    End If
End Sub

Private Function GetRoles() As String()
    Return GetRoles(System.Security.Principal.WindowsIdentity.GetCurrent())
End Function

Private Function GetRoles(ByVal winIdentity As System.Security.Principal.WindowsIdentity) As String()
    Return DirectCast(winIdentity.GetType().InvokeMember("_GetRoles", Reflection.BindingFlags.Static Or Reflection.BindingFlags.InvokeMethod Or Reflection.BindingFlags.NonPublic, Nothing, winIdentity, New Object() {winIdentity.Token}, Nothing), String())
End Function

[ツリー表示へ]
タイトルRe^4: Unicode変換について
記事No1157
投稿日: 2004/11/08(Mon) 12:59
投稿者Hamiltonian
[OSのVer]:Windows    [VBのVer]:VB.NET 

ありがとうございました。
アドバイスどおり実行してみたところ、
正しく動作することを確認しました。
大変助かりました。
VB.NETをあなどっていた自分が恥ずかしい・・・

[ツリー表示へ]