Microsoft警告禁用Excel宏时加载在 Delphi TOleContainer中的Excel文件?

6ss1mwsb  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(99)

我正在使用TOleContainer组件构建一个 Delphi (Delphi 6)程序,它加载了一个Excel文件:

MyOleContainer.CreateObjectFromFile('MyFilePath',False);

字符串
我已经将MyFilePath添加到Excel的受信任位置,这就是为什么我可以在Windows资源管理器中双击打开此Excel文件而没有任何安全警告,尽管该文件包含宏。但是CreateObjectFromFile会发出Excel的安全对话框,其中包含以下消息:

Microsoft Excel安全声明

Microsoft Office发现了一个潜在的安全问题。
Microsoft已阻止宏运行,因为此文件的源不可信。
文件路径:Book1
我该怎么办?我正在阅读步骤,但我觉得没有描述关于加载TOleContainer的场景。
Book1文本表明TOleContainer可能会将原始Excel文件复制到某个临时位置。但是我将整个C:D:驱动器(带子目录)包含到我的受信任位置,但是在TOleContainer中加载时的安全警告仍然存在,而双击打开时没有警告。
在加载TOleContainer时,有什么方法可以避免此安全警告?

procedure TOleContainer.CreateObjectFromFile(const FileName: string;
  Iconic: Boolean);
var
  CreateInfo: TCreateInfo;
begin
  CreateInfo.CreateType := ctFromFile;
  CreateInfo.ShowAsIcon := Iconic;
  CreateInfo.IconMetaPict := 0;
  CreateInfo.FileName := FileName;
  CreateObjectFromInfo(CreateInfo);
end;

procedure TOleContainer.CreateObjectFromInfo(const CreateInfo: TCreateInfo);
begin
  DestroyObject;
  try
    CreateStorage;
    with CreateInfo do
    begin
      case CreateType of
        ctNewObject:
          OleCheck(OleCreate(ClassID, IOleObject, OLERENDER_DRAW, nil,
            Self, FStorage, FOleObject));
        ctFromFile:
          OleCheck(OleCreateFromFile(GUID_NULL, PWideChar(FileName), IOleObject,
            OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
        ctLinkToFile:
          OleCheck(OleCreateLinkToFile(PWideChar(FileName), IOleObject,
            OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
        ctFromData:
          OleCheck(OleCreateFromData(DataObject, IOleObject,
            OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
        ctLinkFromData:
          OleCheck(OleCreateLinkFromData(DataObject, IOleObject,
            OLERENDER_DRAW, nil, Self, FStorage, FOleObject));
      end;
      FDrawAspect := DVASPECT_CONTENT;
      InitObject;
      FOleObject.SetExtent(DVASPECT_CONTENT, PixelsToHimetric(
        Point(ClientWidth, ClientHeight)));
      SetDrawAspect(ShowAsIcon, IconMetaPict);
      UpdateView;
    end;
  except
    DestroyObject;
    raise;
  end;
end;


此代码显示通过以下方式加载Excel文件:

OleCreateFromFile(GUID_NULL, PWideChar(FileName), IOleObject, OLERENDER_DRAW, nil, Self, FStorage, FOleObject)


...使用某种临时存储FStorage(有单独的代码)。因此,从这个临时存储加载可能会对安全警告进行非常特殊的处理。

shyt4zoc

shyt4zoc1#

我有一个非常类似的问题,一个自定义编写的应用程序,通过OLE调用Excel,并给我完全相同的错误对话框,因为你是上面引用。
在另一篇文章中,我发现了一种解决方法,那就是在启动我的自定义应用程序之前,先用一个单独的启用宏的电子表格打开Excel。OLE容器创建的电子表格然后顺利激活,因为宏已启用,因为宏已启用电子表格正在运行。
另一个提示是OLE容器工作表最初显示为不可读和不可编辑。但是,在工作表中单击鼠标右键可以选择“打开”工作表。一个完全可用的Excel版本出现在我这一点上。

相关问题