none
(VC2010 ADO)ファイルパスの中に特殊文字のフォルダ名が入っているmdbファイルをダブルクリックしてソフトを起動させると、 _RecordsetPtr::Openで例外が発生する問題を回避したい。

    質問

  • VisualStudio2010 MFC でソフトを開発しています。 (OSは日本語版Windows7を使っています)

    ソフトに関連付けているファイルは mdbファイルで、 そのファイルをADOで読み書きを行っています。

    mdbのファイルパスの中に日本語以外のハングルや中国語等のフォルダ名が混じっている場合、そのファイルをダブルクリックやファイルドロップして開こうとすると,_RecordsetPtr::Openで "ファイル名が正しくありません"の例外が発生します。
    (ファイルは一時的に英文字名ファイルにコピーして、そのファイルをADOアクセスに使っていますので、直に特殊文字が入ったパスをADOには使っていません)


    構成プロパティ/デバッグ/コマンド引数に問題となっている特殊文字フォルダ名が入ったファイルパスを指定した場合や、ソフト起動後 ファイル/開くなどでは問題なくOpenできます。
    また、フォルダ名が英語でファイル名だけ特殊文字が混じった場合も問題ありません。


    ちなみに CDocument::OnOpenDocument(LPCTSTR lpszPathName)の先頭でlpszPathNameに固定値で問題となっているパスを指定しても、ダブルクリックはダメで、 コマンド引数は問題無しでした。

    CDocumentの派生クラスの中で_RecordsetPtr::Openまでをデバッカーで追っても、コマンド引数を指定した場合と動作しているルートの違いが無いように見えるのですが、
    ダブルクリックとファイルドロップでの起動だけ_RecordsetPtr::Openで例外が起きる原因が判りません。

    なにが原因となるのでしょうか。

    この例外の回避方法がありましたら是非ご教授お願いします

    2018年1月29日 8:24

回答

  • >> プログラムに来る前にOS側でExceptionの情報が設定されているのではないかと考えて >の根拠はなんでしょう?

    この根拠は :InitInstance() がOSからプログラムに来る入口と考えていまして、その先頭で、"C:\\TEST\\aaa.mdb" をOpenした時に Exceptionになる事からそのように考えました。

    まず初めに。。。怪しげな状況を解決する必要がある場合はフレームワークの実装も含めて調査することをお勧めします。少なくともMFCは1.0のころからソースコードが添付されています。

    さて、プログラムの入り口をどうとらえるかもありますが、C++ の場合はスタートアップコードから、外部変数の初期化処理(グローバル変数や起動前に初期化されるスタティック変数)があり、そのあとWinMain が実行されて動きます。

    MFCの場合は、WinMainが MFCのソースコード内にあります。このMFCのWinMainメソッドの中からプリケーションクラスの各種メソッド(InitInstanceもある)が呼び出されるという流れになっています。

    OSから直接的に呼ばれているわけではありません。

    詳しくは、ご自身でデバッグ実行して呼び出し履歴をたどるなどでいろいろ詳しいコードを確認してください。

    ちなみに、例外は Recordset15::Open 内部の

    _com_issue_errorex(_hr, this, __uuidof(this));

    内で生成されています。OSが事前に何かを行っているなどもなく、実行時にその場で生成されます。

    ただし、MFC例外ではありませんので、自分で catch しないとそのままハンドルされない例外としてOS側にハンドリングされてアプリケーションがクラッシュします(_com_error はそういうものです)。

    エラーはその前にある raw_Open メソッドすなわち、Recordset インターフェースの Open メソッドの呼び出し結果です。

    エラーテキストなどから推測される問題は、ファイル名に問題があるということになりますが、呼び出しタイミングが影響しているのだとすればエラーテキストが正しいことを言っていない可能性もあり得ます。

    さて、エラーの状況はもう少し調査したほうがよさそうですが、ここまでの動きでなんとなく感じるのは、メインウィンドウが生成される前に呼び出しているからでは?という気がします。

    ProcessCommandLine の後に、現在冒頭で行っているオープンの呼び出し実験コードを持っていったらどうなりますか?

    それと、確認ですが、SDI(Doc/View形式)ですよね?


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年1月30日 7:44
  • 調査している過程で、short file nameが使われている痕跡がありました。Shift-JIS以外の文字が含まれていてもオープン可能な場合もあるとのことでしたので、パス全体を GetShortPathName などでshort file nameに変換してからオープンを試みるのも一つの手かもしれません。

    ただし、根本原因は先述の通りADO(というより内部のJetエンジン)でANSIモードが使用されていることが原因です。またMicrosoft社はもうこれ以上ADO及びJetエンジンに手を加えることもないでしょうから、Jetエンジンの使用を諦め他のコンポーネントを検討されることをお勧めします。

    2018年1月31日 6:25

すべての返信

  • 自己Resです。

    CWinAppの派生クラス::InitInstance() の中の先頭で 本来問題が出ないファイルを,_RecordsetPtr::Openするコードを入れてみました。


    ダブルクリック以外では _RecordsetPtr::OpenでExceptionが出ませんが、ダブルクリックではExceptionが出ました。

    これにより、プログラムに来る前にどこかで例外が設定されている事も検討に入れています。

    _RecordsetPtr::OpenでExceptionが出ると、その後問題がないファイルをOpenしようとしても全てExceptionが出ます。
    ComのExceptionをクリアするような事は出来ますでしょうか?

    例外Breakを入れると以下で発生してました。

    inline HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) {
        HRESULT _hr = raw_Open(Source, ActiveConnection, CursorType, LockType, Options);
        if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
        return _hr;
    }

    2018年1月30日 4:05
  • 関連付けで起動したときのパス文字列を、メッセージボックスなどで表示してみたらいかがでしょうか?

    関連付けのパターンによっていくつかありますが、まずは、ご自身のアプリケーションクラスのInitInstanceにある、CCommandLineInfo の内容を ParseCommandLine の後で表示してみるといいと思います。

    m_nShellCommand と、m_strFileName あたりを表示すれば、何か違いが判るかもしれません(ショートパス名とかそういうのかもしれません)。

    もし、m_nShellCommand が FileDDE または FileDDENoShow だった場合は、DDE経由でパス名が渡されてくるので、アプリケーションクラスの、OpenDocumentFile をオーバーライドして、表示してみるといいと思います。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年1月30日 4:23
  • Res大変ありがとうございました。

    ご指摘の情報をみました。m_nShellCommandはFileNewで、m_strFileNameは空でした。

    上の自己Resにありますが、ParseCommandLineの前のInitInstance()の先頭で本来エラーにならないファイルをOpenしていてエラーになりますので、
    多国籍語のフォルダ名が入っているファイルをダブルクリックで開くと、OS側でExceptionを設定しているという事にはならないでしょうか ?

    このExceptionをクリアできればいいのですが。

    2018年1月30日 4:59
  • InitInstance()の先頭に入れたテスト用のDBアクセスコードを上げます。

    aaa.mdbはダブルクリックで開いても正しく表示するファイルです。
    これとは別に \\TEST\ハングル語\\aaa.mdb をダブルクリックすると、下記のOpenの箇所でExceptionになります

    BOOL CCstApp::InitInstance()
    {
    	CoInitialize(NULL);
    	try {
    		_RecordsetPtr  recordset;
    		recordset.CreateInstance(__uuidof(Recordset));
    		recordset->CursorLocation = adUseClient;
    
    		/// レコードセットをオープン
    		recordset->Open((LPCTSTR)_T("Version"),
    					(LPCTSTR)_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\TEST\\aaa.mdb;Persist Security Info=FALSE;Jet OLEDB:Database Password=****"),
    					adOpenKeyset,
    					adLockPessimistic,
    					adCmdTableDirect	);
    
     
    	} catch (_com_error &e) {
    		MessageBox(NULL, e.Description(), NULL, MB_OK);
    	}
    	CoUninitialize();
    
    	...
    	// ドキュメントテンプレート作成など
    	...
    	ParseCommandLine(cmdInfo);
         ...
    	return TRUE;
    }

    2018年1月30日 5:16
  • 念のため確認ですが、C++プロジェクトのプロパティで文字セットの設定はUnicodeが指定されているでしょうか?

    #ifndef UNICODE
    #error Require Unicode build.
    #endif

    ソースコードの任意箇所に上記3行を追加することでも確認できます。MBCSが指定されている場合、ハングル語は処理できないはずです。

    2018年1月30日 5:30
  • 例外が出るとありますが具体的にはどんなエラーコードが返ってきていますか?

    あと、ParseCommandLine はまだファイルオープンは行いません。

    コマンドラインパラメータを解析して分解(パース)する部分でこのメソッドを呼び出した後、cmdInfo にいろいろな情報がセットされます。

    cmdInfo が空とありますが、ParseCommandLine の後で確認していますか?もし、そうではないのなら、ParseCommandLine の後で確認してみてください。

    メインウィンドウの作成や、実際のファイルオープン、新規作成といった処理はProcessShellCommand() で実行されます。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年1月30日 5:43
  • Resありがとうございました。

    プロジェクトはUnicodeを設定しています。
    いただいコードを入れてみましたが、ビルド/起動は問題ありませんでした。


    ハングル語(中国語や日本語以外全部)で問題となっていますのはフォルダ名に使用した場合です。
    フォルダ名が英語でファイル名がハングル語などの場合は本件の問題は起きていません。

    そろそろ手詰まりになりそうですので、
    何か判りましたら是非お願い致します。

    2018年1月30日 5:43
  • FYI
    ------------------------------------------------
    Windows SDK ツール:Application Verifier のご紹介
    https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2011/05/29/windows-sdk-application-verifier/
    ------------------------------------------------
    2018年1月30日 6:05
  • とっちゃん様

    ご連絡ありがとうございます。


    上のサンプルコードから
    エラーコードは16進で80004005
    e.Description()からは"ファイル名が正しくありません。" (1)
    と得られました。


    cmdInfo はParseCommandLineのあとに確認しています。
    空なのはm_strFileNameで、m_nShellCommandは"FileNew"と入ってました。

    ParseCommandLine でファイルオープンを行わないのは判っていますが、プログラムに来る前にOS側でExceptionの情報が設定されているのではないかと考えて、
    InitInstance()の先頭でファイルアクセスのサンプルコードを入れました。

    2018年1月30日 6:09
  • 0x80004005 というと、E_FAIL ですかね。Description の文字列内容と一致しないとおろを見ると IErrorInfo などのエラー伝達用インターフェースも提供されていると思われます。

    ところで。。。Parse した後も m_nShellCommand が FileNew とすると、ダブルクリックした時のファイルパスはいったいどうやってわたってきているのでしょう?

    そこも確認したほうがいい気がします(通常ダブルクリックしていれば、DDE 経由か FileOpen でパスが来ているはず)。

    後、気になる表現というか

    プログラムに来る前にOS側でExceptionの情報が設定されているのではないかと考えて

    の根拠はなんでしょう?


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年1月30日 6:28
  • >>プログラムに来る前にOS側でExceptionの情報が設定されているのではないかと考えて>の根拠はなんでしょう?

    この根拠は :InitInstance() がOSからプログラムに来る入口と考えていまして、その先頭で、"C:\\TEST\\aaa.mdb" をOpenした時に Exceptionになる事からそのように考えました。

    ダブルクリックするファイルは"C:\\TEST\\aaa.mdb"でも、全然関係ないフォルダにある別ファイルでも、フォルダ名にハングル語などがあれば、この箇所でExceptionが出て、
    英語や日本語だけだと、Exceptionは出ません。

    >ダブルクリックした時のファイルパスはいったいどうやってわたってきているのでしょう?
    Documentの方に設定されているようですが、もともと自分が作った部分ではないので調べるのに少し時間がかかります

    2018年1月30日 6:53
  • > m_nShellCommand が FileNew とすると、ダブルクリックした時のファイルパスはいったいどうやってわたってきているのでしょう?

    CCommandLineInfo は拡張して、その中にParseParamメソッドがありました。
    ParseParamの引数から得たパスをドキュメントのメンバー変数に入れて、そのメンバー変数でファイルをOpenしています。
    パスは正しく来ていました。 (間にハングル文字のフォルダ名が入っています)

    現状ではここに来る前のInitInstanceの先頭に、ファイル名が英文字の固定値でもExceptionが出てますので、この部分とは関係無いように考えています。

    2018年1月30日 7:26
  • >> プログラムに来る前にOS側でExceptionの情報が設定されているのではないかと考えて >の根拠はなんでしょう?

    この根拠は :InitInstance() がOSからプログラムに来る入口と考えていまして、その先頭で、"C:\\TEST\\aaa.mdb" をOpenした時に Exceptionになる事からそのように考えました。

    まず初めに。。。怪しげな状況を解決する必要がある場合はフレームワークの実装も含めて調査することをお勧めします。少なくともMFCは1.0のころからソースコードが添付されています。

    さて、プログラムの入り口をどうとらえるかもありますが、C++ の場合はスタートアップコードから、外部変数の初期化処理(グローバル変数や起動前に初期化されるスタティック変数)があり、そのあとWinMain が実行されて動きます。

    MFCの場合は、WinMainが MFCのソースコード内にあります。このMFCのWinMainメソッドの中からプリケーションクラスの各種メソッド(InitInstanceもある)が呼び出されるという流れになっています。

    OSから直接的に呼ばれているわけではありません。

    詳しくは、ご自身でデバッグ実行して呼び出し履歴をたどるなどでいろいろ詳しいコードを確認してください。

    ちなみに、例外は Recordset15::Open 内部の

    _com_issue_errorex(_hr, this, __uuidof(this));

    内で生成されています。OSが事前に何かを行っているなどもなく、実行時にその場で生成されます。

    ただし、MFC例外ではありませんので、自分で catch しないとそのままハンドルされない例外としてOS側にハンドリングされてアプリケーションがクラッシュします(_com_error はそういうものです)。

    エラーはその前にある raw_Open メソッドすなわち、Recordset インターフェースの Open メソッドの呼び出し結果です。

    エラーテキストなどから推測される問題は、ファイル名に問題があるということになりますが、呼び出しタイミングが影響しているのだとすればエラーテキストが正しいことを言っていない可能性もあり得ます。

    さて、エラーの状況はもう少し調査したほうがよさそうですが、ここまでの動きでなんとなく感じるのは、メインウィンドウが生成される前に呼び出しているからでは?という気がします。

    ProcessCommandLine の後に、現在冒頭で行っているオープンの呼び出し実験コードを持っていったらどうなりますか?

    それと、確認ですが、SDI(Doc/View形式)ですよね?


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年1月30日 7:44
  • とっちゃん様

    Resありがとうございます。

    いくつかのご質問にお答えします。

    >ProcessCommandLine の後に、現在冒頭で行っているオープンの呼び出し実験コードを持っていったらどうなりますか?

    InitInstance先頭に入れた場合と結果は同じでした。
    (同じというのは、通常パスではException無し、ハングル文字フォルダ名が含まれているException発生し、メッセージは"ファイル名が正しくありません"です)


    ついでにCWinAppの派生クラスのコンストラクタにも入れてみましたが結果は同じです。


    >SDI(Doc/View形式)ですよね?
    SDIです。

    2018年1月30日 8:08
  • VS2010の新規作成でシンプルなMFCプロジェクト(SDI)を作って CoInitialize(NULL)~CoUninitialize()までの
    テストコードをInitInstanceの各所に入れてテストしましたが、結果は同じでした。

    今は使っている msado28.tlb/msjro.dll を疑い始めています。(この辺り詳しくないですが)

    VS2010/Windows7から使えて最新な msado??.tlb/msjro.dll はどうやって見つければ良いのでしょうか?
    2018年1月30日 9:19
  • いくつか確認と整理をしたいです。

    まず、COM関連。アプリケーションのCOM回りの初期化はどうやっていますか?

    MFCの場合、

    1. AfxOleInit() を使う(OleInitializeを呼び出すことに相当)
    2. CoInitialize() または、CoInitializeEx(COINIT_APARTMENTTHREADED)を使う
    3. CoInitializeEx(COINIT_MULTITHREADED)を使う

    この3つが選択肢なのですが、事実上1しかありません(MFCの内部実装の問題)。

    アプリ内でCOMを使っているのでどこかでちゃんと初期化しているはずです。できればそれを使うように統一しておいたほうがいいでしょう。

    次に現在テストしているタイミングの問題ですが

    テストしてみたタイミングとしては

    1. InitInstance 内 ProcessCommandLine より前
    2. InitInstance 内 ProcessCommandLine の後
    3. CDocument::OnOpenDocument
    4. メニューからコマンド選択

    の4つしょうか?

    この4つのうち、4のみ何の問題もなく、

    1は英数字だけでもエラーが出る、2,3は英数字だけではエラーは出ず、ハングルが「ディレクトリ名」にあるとエラーが出る

    であってますか?

    それと、多分ないと思いますが、CoInitialize がセットになってテストしている点が気になります。

    実際のアプリ内の利用でも同じようにファイルオープンでCOMを初期化しているということではないですよね?


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2018年1月31日 1:49
  • Recordset::Open()だけを行うプログラムを作成してみました。残念ながら同様のエラーが発生していました。処理を追いかけたところ、msjet40.dllがANSIバージョンのCreateFileAを呼び出して.mdbファイルをオープンしようとしています。そのため、日本語以外の文字を含むファイル名については開けない仕様のようです。

    呼び出し履歴

    2018年1月31日 4:08
  • Resありがとうございました。

    昨日作ったサンプルプロジェクトでは、使っているのはCoInitialize()だけです。
    メインのプログラムはAfxOleInit/CoInitialize 混在していたので、これは後で統一したいです。


    1.InitInstance 内 ProcessCommandLine より前
    2.InitInstance 内 ProcessCommandLine の後
    3.CDocument::OnOpenDocument
    4.メニューからコマンド選択

    この他
    5. CWinAppの派生クラスのコンストラクタの中
    でもテストしました。


    テスト方法
    1.exeをダブりクリックしてソフトを起動した場合
    ・英数字だけのファイルパスだとどのタイミングでRecordsetPtr::OpenしてもExceptionは出ません。
    ・パス中にハングル文字のフォルダが入っているファイルをRecordsetPtr::OpenしようとするどのタイミングでもExceptionが出ます。

    2. パス中にハングル文字フォルダが入っているファイルをダブルクリックしてソフトを起動した場合、
    ・全てのタイミングで英数字だけのファイルパスをRecordsetPtr::Openしても Exceptionがでます。

     この状態になると、起動後に英数字だけのファイルをRecordsetPtr::Openすると全てExceptionが出るようになります。


    3.英数字だけのファイルをダブルクリックしてソフトを起動した場合、
    ・全てのタイミングで英数字だけのファイルパスをRecordsetPtr::Openしても Exceptionは出ません。


    今回問題としているのは2番目です。

    本件で、私の方が調査できるのは本日の17:00までとなりました。

    それまでは少しでも進めればと考えています。

    2018年1月31日 4:42
  • 佐祐理様

    検証大変ありがとうございました。

    ファイル名だけハングル文字でフォルダ名が日英数になっていると問題ないのですが、
    この事についてはどう判断できますでしょうか ?

    2018年1月31日 4:51
  • 佐祐理様

    なんども済みません。

    ハングル文字が入っているmdbファイルをそのままRecordsetPtr::Openに渡すとExceptionはでます。

    今回問題となっているのはフォルダ名にハングル文字が入ったファイルをダブルクリックして、ソフトを起動した後、
    そのファイルではなくて、別の英数字だけのファイルをRecordsetPtr::OpenするとExceptionが出る事でした

    2018年1月31日 4:58
  • 調査している過程で、short file nameが使われている痕跡がありました。Shift-JIS以外の文字が含まれていてもオープン可能な場合もあるとのことでしたので、パス全体を GetShortPathName などでshort file nameに変換してからオープンを試みるのも一つの手かもしれません。

    ただし、根本原因は先述の通りADO(というより内部のJetエンジン)でANSIモードが使用されていることが原因です。またMicrosoft社はもうこれ以上ADO及びJetエンジンに手を加えることもないでしょうから、Jetエンジンの使用を諦め他のコンポーネントを検討されることをお勧めします。

    2018年1月31日 6:25
  • 佐祐理様

    ご連絡ありがとうございます。

    上記のダブルクリックで起動したソフトの中では、どのタイミングでもファイル名にどうゆう文字を使っていても、
    RecordsetPtr::OpenからExceptionがでますので、今の所は ADOの限界かなぁ と考えています。

    クライアントの理解と予算次第ですが、
    ADOに関しては、どこかのタイミングで作り直す事も検討しています。

    2018年1月31日 6:47
  • で、 GetShortPathName は試されたのでしょうか?
    2018年1月31日 7:34
  • Resありがとうございます。

    もともとのプログラムでは、ハングル文字が来ても、英語名の一時ファイルにコピーしてDBアクセスをしていましたので、

    あまり変わらないかと思いましてGetShortPathName は試していません。

    上のテストサンプルにあるように、ハングル文字がフォルダ名が入ったファイルをダブルクリックして起動された場合、"C:\\TEST\\aaa.mdb" のような固定ファイル名を使ってもエラーになります。

    ちなみに、C:\\TEST\\aaa.mdbはこれ以外はエラーにならない正しいファイルです。

    2018年1月31日 8:46
  • プログラム回避は諦めて、かなりの特殊ケースですのでサポートで対応する事になりました。

    回答をいただいた方々には回答マークを付けさせて頂きました。みなさん大変ありがとうございました。

    2018年1月31日 9:34
  • 本件、問題点が2つあるように見受けられます。

    1. ダブルクリックで起動された際に渡されるファイル名が通常とは異なる?
      → これは文字列を確認するまでの話です。とっちゃんさんからいろいろと提案されていますので、確認を行い、どのような文字列になっているのかを報告してください。単なる文字列の問題ですので、具体的な文字列がわかれば簡単に解決できるはずです。

    # ファイル名が "" で括られているとか簡単な話じゃないかな?

    2. たとえ正しい文字列であってもShift-JISに含まれない文字列(中国語・ハングルなど)がファイル名に含まれるとRecordset::Open()に失敗する
      → こちらはJetエンジンの制限です。積極的ではありませんがGetShortPathNameを用いることで当該ファイルをShift-JIS内に収まる名前でアクセスでき、開くことができるようになります。根本的には.mdb及びJetエンジンの利用を諦めることです。

    2018年1月31日 11:15
  • ご連絡ありがとうございます。

    1の回答です。

    ファイル名が通常とは異なる? の通常が何か判らなかったのですが

    ダブルクリックさせるファイル名はParseCommandLineの後から得た値で以下となります。

    "C:\TEST\aa\aaa.mdb"

    フォルダ名に1文字ハングル文字が入ってます。 

    このファイルをダブルクリックしたので、ファイル名は正しく渡ってきています。

    しかし、このファイル名はプログラムでは一切使用してなくて、

    Shift-JISだけの "C:\TEST\aaa.mdb" をOpenしようとしてエラーになる事が今回ご質問に上げている内容となっています。

    ちなみに、

    "C:\TEST\日本語\aaa.mdb"

    "C:\TEST\日本語\.mdb"

    などをダブルクリックしてこのプログラムを起動した中で"C:\TEST\aaa.mdb"Openしてもエラーにはなりません。

    2018年2月1日 0:33
  • 何を説明されているのか理解できませんでした。あなたは最初の質問文で

    そのファイルをダブルクリックやファイルドロップして開こうとすると,_RecordsetPtr::Openで "ファイル名が正しくありません"の例外が発生します。

    構成プロパティ/デバッグ/コマンド引数に問題となっている特殊文字フォルダ名が入ったファイルパスを指定した場合や、ソフト起動後 ファイル/開くなどでは問題なくOpenできます。

    と説明しています。であれば問題の発生するファイル名に対し

    1. 前者ダブルクリック等の問題が発生する操作方法によりプログラムが受け取った文字列
    2. 後者コマンド引数等の問題が発生しない操作方法によりプログラムが受け取った文字列

    この両者の文字列を比較することで原因がわかるはず、と指摘しています。文字列が正しいかどうかを尋ねているのではありません。

    2018年2月1日 1:18