2

以下のコードを使用して、RAD Studio XE7 の C++Builder から .xlsx ファイルを開こうとしています。

#include "ComObj.hpp"

Variant Excel = CreateOleObject("Excel.Application");
Variant Books = Excel.OlePropertyGet("Workbooks");
Excel.OlePropertySet("Visible", true);
// An escape character is missing but the problem remains
Books.OleProcedure("Open", L"D:\1.xlsx"); // exception here

ただし、最後の行で例外が発生し、次のメッセージが表示されます。

Project2.exe は例外クラス EOleException を発生させ、「残念ながら、ファイル TRUE.xlsx が見つかりませんでした。移動、名前変更、または削除された可能性がありますか?'.

ソースが途切れる画面

Delphi のコードは正常に動作しているようです。

uses ComObj;

var
  Excel, Books: Variant;
begin
    Excel := CreateOleObject('Excel.Application');
    Books := Excel.Workbooks;
    Excel.Visible := True;
    Books.Open('D:\1.xlsx'); // code passes
end;

誰かが解決策を知っていますか?

Update1: VB の次のコードも正常に動作します。

Sub Button1_Click()
 Dim xlApp As Excel.Application
 Dim xlBooks As Excel.Workbooks

 Set xlApp = CreateObject("Excel.Application")
 Set xlBooks = xlApp.Workbooks

 xlApp.Visible = True
 xlBooks.Open ("D:\1.xlsx")
End Sub

Update2: 生の文字列リテラルを送信すると、同じ例外が発生します。

Books.OleProcedure("Open", uR"(D:\1.xlsx)");

環境の問題でもないようです。この例をいくつかのコンピューターでテストしましたが、効果はありませんでした。

4

3 に答える 3

2

C++ では、バックスラッシュ文字は文字列リテラルのエスケープ文字であるため、それ自体をエスケープする必要があります。それ以外の

L"D:\1.xlsx"

あなたは書く必要があります

L"D:\\1.xlsx"

ただし、エラーメッセージは奇妙です。1これは、COM ディスパッチ コードの変換によって、 が真の値として解釈され、テキストに変換されるのとほとんど同じです。問題を回避する可能性のあるとしてファイル名を渡すことができますSystem::WideString

System::WideString filename = L"D:\\1.xlsx";
Books.OleProcedure("Open", filename);

あなたが報告していることは、あまりにも奇妙に思えますが、真実ではありません! あまりにも風変わりなので、信じがたいことを告白しなければなりません。

于 2014-12-15T22:50:09.663 に答える
0

この問題は、C++ の使用、つまり C++ コンパイラがリテラル文字列 (または少なくともこの特定の C++ コンパイラ) を処理する方法に非常に具体的に関連しているようです。この場合の問題が何であるかは、私には言えません。(一見) 正しいエスケープでは問題が解決されないため、コンパイラのバグである可能性さえあります。

この場合、リテラル文字列の処理である可能性を排除するために、さまざまな戦略を採用できます。しかし、これにはリテラル文字列が含まれているため、XE7 を使用しているため、リテラルを生の文字列として表現することで、これをより明示的にバイパスできるはずです (C++ Builder でサポートされている/サポートされている C++11 のように) XE7):

Books.OleProcedure("Open", uR"(D:\1.xlsx)"); // uR indicates UTF-16 Raw string

生の文字列リテラルでは、特に文字をエスケープしないことに注意してください\

于 2014-12-16T02:31:51.250 に答える