CopyFile APIを正しく動作させるためには

解決


z  2014-04-22 02:39:30  No: 46267

お世話になります。

従来、CopyFile APIを用いて任意のファイルをネットワークドライブで
追加したドライブ(例.G:\)にファイルコピーをしていました。
> CopyFile(PChar(C:\xxxx\xxxx), PChar(G:\xxxx\xxxx), False)

従来、開発環境はDelphi2007 WindowsXPで、実行環境はXPで問題なくコピーできていました。

この度、実行環境がWindows7 64bitに変更となりましたので、上記バイナリを
ローカルに格納して実行してみたところファイルコピーに
失敗するようになりました。(GetLastError関数の返り値は3です。)

なお、上記バイナリは「管理者として実行」しており、かつコマンドプロンプトで
上記と同様のコマンドを実行した場合は問題なくコピーされます。

また、開発環境Windows7 64bit DelphiXE3で作成したバイナリだと問題なくファイルコピーが行われます。

上記を踏まえて、開発環境Delphi2007 WindowsXPでファイルコピーを
行うためには何が問題なのか分かる方はお手数ですが教えて頂けませんか。

以上です。


Mr.XRAY  2014-04-22 08:43:08  No: 46268

>(GetLastError関数の返り値は3です。)

3 というのは,「指定されたパスが見つかりません」なのですが ?
確認してみてはいかがでしょうか ?

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382%28v=vs.85%29.aspx

参考までに,エラーコードは次のようにして,メッセージの文字列に変換できます.
  SysErrorMessage(ErrCode);  // ErrCode がエラーコード


z  2014-04-22 15:33:51  No: 46269

連絡ありがとうございました。
コマンドプロンプトで同じコマンドを実行した場合、
ファイルコピーができるなどの理由で「指定されたパスが見つかりません。」は
問題ないと判断していましたが、改めてもう1回確認します。

> 参考までに,エラーコードは次のようにして,メッセージの文字列に変換できます.
>   SysErrorMessage(ErrCode);  // ErrCode がエラーコード
SysErrorMessage関数の存在を始めて知りました。これまでGetLastError関数が
返り値を返したら都度ネットでエラーコード一覧を確認していましたが、
今後は教えて頂いた関数に置き換えたいと思います。


z  2014-04-22 19:13:44  No: 46270

引き続き調べてみたところ、
①Delphi2007で作成したバイナリを XE3がインストールされたPCで実行すると先の例で挙げたGドライブが認識できない ※
②Delphi XE3で作成したバイナリを XE3がインストールされたPCで実行すると先の例で挙げたGドライブが認識できる
③Delphi2007で作成したバイナリを2007がインストールされたPCで実行すると先の例で挙げたGドライブが認識できる
※TOpenDialogを実行してみたところコンピュータにGドライブが表示されませんでした。
ということが分かりました。
また、1点注意点としてWindowsのログインID・パスワードがGドライブにログインする際のものと異なりますが、
①以外は問題なく動作しています。

もう1点だけお聞きしたいのですが、
例えばDelphi2007で作成したバイナリを異なるバージョンのDelphiがインストールされたマシンで
実行する際の注意点で挙げられるのはどのようなことでしょうか。
dbxora30.dllのようにEXEに含まれていないファイルは実行フォルダにコピーするよう注意はしています。


Mr.XRAY  2014-04-23 18:57:33  No: 46271

調査すべきは,前のレスで書いたように,「指定されたパスが見つかりません」だと思いますが.
例えば,以下のような簡単なテストコードを作成すれば確認できます.

http://docwiki.embarcadero.com/CodeExamples/XE5/en/TDirectoryExists_%28Delphi%29

問題が発生した時は,その問題だけをテストした方がいいと思いますよ.
そうしないと,問題の切り分けができません.

>コンピュータにGドライブが表示されませんでした。

ドライブ名もパス名の一部です,表示されない,ということは無いということではないのですか ?
(ネットワークの接続状態によっては,違う場合もありますが)

ネットワーク関係は,クライアント(コンピュータ)側で操作可能な場合と,
組織のネットワーク管理者等による場合があるので,自分で判断,操作してください.

# ネットワークを使用するのであれば,○囲み数字は使用しない方がいいと思います.個人的には.
http://www.asahi-net.or.jp/~ax2s-kmtn/ref/mdc.html


au  2014-04-23 20:21:51  No: 46272

ログインという話なのでGドライブはローカルドライブでは無くネットワークドライブをマップしているのでしょうか?

であれば、関係ないかも知れませんがUACが有効な環境だとネットワークドライブの設定は別個に管理されているので、管理者権限などでプログラムを動かした場合はネットワークドライブが認識出来ないという状態になります。
詳しくは、「uac ネットワークドライブ」等で検索して下さい。

Gドライブが見えるプログラムと見えないプログラムで実行権限が異なっているのではないでしょうか?


z  2014-04-23 22:03:56  No: 46273

> 問題が発生した時は,その問題だけをテストした方がいいと思いますよ.
> そうしないと,問題の切り分けができません.
申し訳ありません。テストはしたのですが、確認結果を一切記載していませんでした。
結果としては、DirectoryExistsのみのコードを試してみたところエラー通りの結果となり、
次にTOpenDialogのみのコードを試してみたところ、今回の例だとGドライブが表示されませんでした。
ログインID・パスワードが同一なドライブおよびCドライブなどは表示されます。

また、全く同じコードをXE3環境で作成したバイナリを実行すると「フォルダはある」と表示され、
かつ、TOpenDialogでGドライブが表示されました。

> ネットワークを使用するのであれば,○囲み数字は使用しない方がいいと思います.個人的には.
申し訳ありません。以後気をつけます。

> ログインという話なのでGドライブはローカルドライブでは無くネットワークドライブをマップしているのでしょうか?
はい、その通りです。

> であれば、関係ないかも知れませんがUACが有効な環境だとネットワークドライブの設定は別個に管理されているので、
> 管理者権限などでプログラムを動かした場合はネットワークドライブが認識出来ないという状態になります。
> 詳しくは、「uac ネットワークドライブ」等で検索して下さい。
> Gドライブが見えるプログラムと見えないプログラムで実行権限が異なっているのではないでしょうか?
ありがとうございます。これから確認してみます。

いろいろアドバイスありがとうございます。


JIS X  2014-04-24 01:03:00  No: 46274

> # ネットワークを使用するのであれば,○囲み数字は使用しない方がいいと思います.個人的には.
> # http://www.asahi-net.or.jp/~ax2s-kmtn/ref/mdc.html

本題とは関係ないですが、丸囲み文字はかなり前に正式にJIS規格入りし、今は機種依存ではありません。
参考URLとして出している先は最終更新が8年も前のものであり、現在では正しい情報ではないです。
そもそも文字化けの懸念先として挙げられているMacintoshですが、
OSXの標準日本語フォントがMicrosoftのCP932互換で丸囲み文字を符号化しているため、化けることはありません。

もちろん新しいJIS規格に対応していない機種では文字化け扱いとなるかもしれませんが、
そのようなマシンはネットに繋ぐこと自体が危険であるような古い仕様ということになりますし、
新しい規格で新規に追加された文字は文字化けするから使ってはいけない…などという話は聞いたことがないので、
同じ規格上にある丸囲み文字だけ使ってはいけないという話にもならないと思います。


  2014-04-24 20:03:45  No: 46275

> であれば、関係ないかも知れませんがUACが有効な環境だとネットワークドライブの設定は別個に管理されているので、
> 管理者権限などでプログラムを動かした場合はネットワークドライブが認識出来ないという状態になります。
> 詳しくは、「uac ネットワークドライブ」等で検索して下さい。
> Gドライブが見えるプログラムと見えないプログラムで実行権限が異なっているのではないでしょうか?

上記内容をもとに下記URLの対策で問題なく動作するようになりました。
http://lib.asprova.com/onlinehelp/ja/AS2003HELP08990070.html
大変助かりました。ありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加