|
分類:[VB.NET/VB2005 以降]
C++で作成されたdllを、以下のような感じでVB2013より呼び出しています。 <DllImport("test.dll")> _ Private Shared Function GetTestData(ByVal filePath As String, ByVal testResult As System.Text.StringBuilder) As Integer End Function
ただし、dllの文字列引数(具体的にはファイルのパス)に全角文字が含まれていると うまく動かないことが分かりました。 (すべての全角文字ではないようですが、問題の文字の特定までは行っておりません。)
おそらく、dll側では文字列をANSIで扱っているのだろうと思いますので、 最悪、dll側をUnicode対応することで解決するとは思うのですが、 このdllを作った人はすでに退職し、私はC++については詳しくありません。
そこで、VB側で何とか回避できないかと色々考え、 最終的にパスの文字列がすべて半角文字にしてしまうという方法を思いつきました。 具体的には、dllに渡すファイルを任意のフォルダーにコピーし、 ファイル名も半角文字にしてあげる、というものです。
試しにdllに渡すファイルをユーザのtempフォルダ内にコピーしたところ とりあえずはうまく動いたのですが、 別の問題が出てきました。
それは、ユーザ名そのものに問題の全角文字が使われていると、 「C:\Users\ユーザ名\AppData\Local\Temp」のようになり、 結局ファイルパスに全角文字が含まれてしまう、ということです。
そこで質問なのですが、 すべてのユーザがフルアクセス可能で、 かつパスの文字列がすべて半角文字で構成されている、 上記の姑息な方法に利用可能な場所ってどこかありますか?
「C:\ProgramData」の配下も検討してみましたが、 フルアクセスができないアカウント権限があるようで、 以下のような例外が発生する場合があるようです。
System.UnauthorizedAccessException: パス 'C:\ProgramData\AAA\BBB\CCC.ddd' へのアクセスが拒否されました。 場所 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 場所 System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite) 場所 ...
あと、C++のdllをUnicode対応する場合、結構大変でしょうか? C++の詳細な知識がなくとも、何か「おまじない」のような文字をコードに追加するだけでOK、 ということはないでしょうか?
以上、アドバイスの程どうぞよろしくお願いします。
|