■94008 / inTopicNo.2) |
Re[1]: 簡体字が取り込めません。+α(こっちの方が本題かも) |
□投稿者/ 魔界の仮面弁士 (2578回)-(2020/03/02(Mon) 20:59:43)
|
■No94007 (山猿 さん) に返信
> 以下のデータファイル転送サービスを利用させて頂きました。
OneDrive の公開フォルダーを使えば、期間制限しなくて済みそう。
> 前回同様、簡体字(Unicode)が文字化けしてしまいます。
前回と言うのは、 No93935 のスレッドですね。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=93935
アップロード頂いたソースをざっと見ただけで、実行はしていないのですが、
問題点が結構ありますね。もしかして、VB5 あたりから移植してたりしますか?
まず、データ型があちこち間違っています。
『Option Strict On』を指定して、その状態でコンパイルが通るようにしておいてください。
次に、これは前回と同じですが、ANSI / Unicode を明確にするようにしてください。
API 宣言もそうですし、構造体宣言もそうです。
たとえば StructLayout 属性には、CharSet フィールドがありますし、
LV_ITEM 構造体にも、ANSI バージョンと Unicode バージョンがあります。
https://docs.microsoft.com/en-us/windows/win32/api/commctrl/ns-commctrl-lvitemw
https://docs.microsoft.com/en-us/windows/win32/api/commctrl/ns-commctrl-lvitema
> Dim rtc As Integer = Getlistviewitem(hwnd, cline, str) ←(該当関数。下記参照。hwndは別プロセスのListViewID)
Getlistviewitem を Public にするのは分かりますが、
Decalre まで Public にする必要は無いのでは…?
間違いというわけでは無いですが、できるだけカプセル化した方が良いですよ。
それと、hwnd 引数を ByRef にしているようですが、これは出力引数では無いので、
ByVal として宣言されるべきです。
そして最初の OpenProcess API ですが、SDK 上の定義が
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
なのですから、それを
Public Declare Function OpenProcess Lib "kernel32" (
ByVal dwDesiredAccess As Integer,
ByVal bInheritHandle As Integer,
ByVal dwProcessId As Integer) As Integer
とするのは正しくありません。
引数については、一応許容範囲。
DWORD は「32bit 符号なし整数型」なので、Integer という「32bit 符号付整数型」に翻訳するのは許容範囲。(As UInteger でも良い)
BOOL は「4 バイトの Boolean 値 (true != 0、false = 0)」なので、これも Integer にできます。(As Boolean でも良い)
問題は戻り値。
SDK 上の定義は HANDLE 型ですが、これは Integer ではなく、As IntPtr として宣言されるべきです。
(丁寧に書く場合は、SafeHandle や SafeHandleZeroOrMinusOneIsInvalid を使うこともあります)
今回は "Any CPU 32-bit preferred" なビルドなので、As Integer でも一応通るのですが、
Integer に翻訳するのは、あまり良いコードとは言えません。
VirtualAllocEx / VirtualFreeEx / CloseHandle においても、IntPtr 指定とすべきところが
間違っているようですので、SDK を見ながら、正しい記述に直しておいてください。
それと、SendMessage API の宣言がありませんでした。こちらの提示もお願いします。
これも ANSI 版と Unicode 版が存在する関数です。( No93938 で幾つか例示しましたよね)
で、ANSI / Unicode 以外で間違っているのが、引数の指定。
> nrow = SendMessage(hWnd, LVM_GETTITEMCOUNT, IntPtr.Zero, CLng(0))
となっていますが、これも明確に間違いです。
WPARAM 型は、Win64 では 64bit/Win32 では 32bit/Win16 では 16bit
LPARAM 型は、Win64 では 64bit/Win32 では 32bit/Win16 では 32bit
64bit ビルドの時は CLng(0) を渡せますが、そうすると OpenProcess や VirtualAllocEx 等の宣言が合わなくなります。
32bit ビルドだとしたら、CLng(0) を渡すのは NG です。SendMessage の宣言内容によっては、暗黙の型変換によって
32bit 値に縮小されて渡されるかもしれませんが、そうだとしたら CLng するのは無意味ですし、
そもそも「Option Strict On」の時にコンパイルエラーとして検出されることになるでしょう。
> Dim cline As Long = Int((y - 33) / 32) + 1
y の型が分からないですが、これも不自然なコードです。
代入式の左辺は Long 型ですが、右辺はそうではないからです。(おそらく Double のはず)
API を使うのであれば、「Option Strict On」であっても
正しくコンパイルできるようなコードを記述することを強くおすすめします。
> SendMessageW(hWnd, LVM_GETITEMW, IntPtr.Zero, sm1) '取得依頼
API 宣言が省略されているので確証は持てませんが、上記自体は正しい呼び出しに見えます。
ただ、A 系と W 系を混在させたコードになるのは望ましくないので、
今回のケースでは、W 系に統一させたコードに置き換えましょう。
|
|