标签: ole

从MS Access转换OLE图像对象以在.NET中使用

我正在努力将基于Access的系统重新开发到c#.net,但是当MS从办公室2003到办公室2007时,他们删除了访问中的图片编辑器 - 这意味着以前存储的图片将不再显示在系统中.该公司的人做了一个黑客,基本上使用excel在后台保存了VBA图像(如果你需要它我可以获得更多信息)但基本上它意味着仍然可以使用访问图像控件(对象绑定帧).

但是,我现在遇到了尝试在.NET应用程序中显示这些问题的问题,并且经过无数天尝试操作字节数组的不同方法后,我接近放弃了.我尝试了至少8个不同的建议解决方案,每个解决方案在执行Image.fromStream()时以"参数未识别"异常结束.下面是迄今为止让我最接近的代码:

    private void imageExtractTest()
    {
        LogOnDataSetTableAdapters.QueriesTableAdapter qa =
            new LogOnDataSetTableAdapters.QueriesTableAdapter();

        object docO = qa.GetLogonImage();
        if (docO == null || !(docO is byte[]))
        {
            return;
        }
        byte[] doc = (byte[])docO;

        MemoryStream ms = new MemoryStream();
        ms.Write(doc, 0, doc.Length);
        int firstByte;
        int secondByte;
        ms.Seek(0, SeekOrigin.Begin);
        firstByte = ms.ReadByte();
        secondByte = ms.ReadByte();

        if (firstByte != 0x15 && secondByte != 0x1C)
        {
            //ErrorResponse("Stored object is not an Access File.");
            return;
        }

        int fileTypeLoc = 20; // begin of the file type …
Run Code Online (Sandbox Code Playgroud)

.net c# ms-access ole

7
推荐指数
1
解决办法
8835
查看次数

Java中有OLE自动化吗?

是否可以在Java中使用OLE自动化?如果没有,为什么在Java中不可能?

我希望自动导出不同格式的excel电子表格(即.csv等...)

在此先感谢您的答案:)

java excel ole ole-automation

7
推荐指数
2
解决办法
9991
查看次数

无法将类型(Null)的变体转换为类型(OleStr)

你知道为什么下面的代码块会在某些计算机上否定"无法将类型(Null)的变体转换为类型(OleStr)",而不是全部,但是十分之三的计算机会生成错误消息.

在此输入图像描述

function GetWMIstringSW(const WMIClass, WMIProperty:string): string;

const
  wbemFlagForwardOnly = $00000020;

var
  FWbemObjectSet: OLEVariant;
  FWbemObject   : OLEVariant;
  oEnum         : IEnumvariant;
  iValue        : LongWord;
  LNode         : TTreeNode;
  LNode2        : TTreeNode;

begin
  Result:='';
  FWbemObjectSet:= FWMIService.ExecQuery(Format('Select %s from %s',[WMIProperty, WMIClass]),'WQL',wbemFlagForwardOnly);
  oEnum         := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;

  while oEnum.Next(1, FWbemObject, iValue) = 0 do
    begin
      if not VarIsNull(FWbemObject.Properties_.Item(WMIProperty).Value) then
      Result:=FWbemObject.Properties_.Item(WMIProperty).Value;
      LNode := ClientForm.TreeView1.Items.AddChild(Node, Format('%s',[String(FWbemObject.Name)]));

      LNode2 := ClientForm.TreeView1.Items.AddChild(LNode, Format('%s',[String(FWbemObject.Version)]));
      FWbemObject:=Unassigned;
    end;

end;
Run Code Online (Sandbox Code Playgroud)

然后在FormCreate中执行该函数:

GETWMIstringSW('Win32_Product','Name');
Run Code Online (Sandbox Code Playgroud)

非常感谢你的帮助.

delphi wmi ole delphi-xe2

7
推荐指数
1
解决办法
4万
查看次数

在 MS Word 中将 MathML 转换为 MathType

我正在编写一个从 XML&MathML 到 MS Word 文档的转换器。
我正在使用 MFC 和 Word 自动化,因此编写这样的文本没有问题:

_Application app;  
COleVariant vtOpt(DISP_E_PARAMNOTFOUND, VT_ERROR),
            vtTrue((short)TRUE),
            vtFalse((short)FALSE);
app.CreateDispatch("Word.Application",NULL);
Documents docs = app.GetDocuments();
_Document doc = docs.Add (vtOpt, vtOpt, vtOpt, vtOpt);
Range range = doc.Range (vtOpt, vtOpt);
range.InsertAfter (_T("Hello Word!"));
Run Code Online (Sandbox Code Playgroud)

现在的问题是将 MathML 方程转换为嵌入的 MathType 对象。我发现的一种可能方法是在 TeX 中编写方程,然后以编程方式调用 MTCommand_TeXToggle(在 Word 的 MathType 6.5 库中找到)宏,该宏将 TeX 替换为 MathType OLE 对象。但是后来我必须以某种方式将 MathML 转换为 TeX,这并不容易。

我知道,MathType OLE 对象应该接受原始 MathML 数据,但是当我尝试以编程方式创建和访问 OLE 对象时:

InlineShapes shapes = doc.GetInlineShapes ();
InlineShape control = shapes.AddOLEObject (COleVariant("Equation.DSMT4"), vtOpt, vtFalse, …
Run Code Online (Sandbox Code Playgroud)

mfc automation ole mathml

6
推荐指数
1
解决办法
8278
查看次数

为什么这个C#COM类可以从VBScript而不是JScript中使用?

考虑下面给出的C#中与自动化兼容的COM库.它遵循一个常见的COM模式,即有一个可见的工厂coclass FooFactory实现ICreateFoos,它创建一个IFoo类型的对象.FooFactory是类型库中唯一的 coclass.(工厂模式对COM特别有用,因为它不允许参数化构造函数).

在下面的代码中,我发现我无法从jscript 访问返回的IFoo接口,除非我使FooImpl类ComVisible(通过取消注释注释行;这使它在类型库中显示为coclass).从VBscript访问它没有这样的问题.

也就是说,我可以运行这个VBScript:

set ff = CreateObject("jstest.FooFactory")
set foo = ff.CreateFoo(0)
foo.Foo
Run Code Online (Sandbox Code Playgroud)

但这个功能相同的 JScript失败,错误"C:\ temp\jstest\jstest.js(4,1)Microsoft JScript运行时错误:'foo'为null或不是对象":

var ff = new ActiveXObject("jstest.FooFactory");
var foo = ff.CreateFoo(0)
//WScript.Stdout.WriteLine(null==foo)
foo.Foo();
Run Code Online (Sandbox Code Playgroud)

如果我取消注释该行,我可以看到null == foo为false.

为什么会这样?这是一个错误吗?请注意,我认为这是一个问题,是JScript和C#/ .net特定实现(可能是IDispatch)的组合,因为我有其他类似的COM服务器 - 用C++实现 - 不会从JScript中出现这个问题.

如果我在下面的代码中取消注释注释行,使得FooImpl作为coclass可见,那么问题就会消失 - 但我特别不希望这样做,因为我不想暴露实现细节.一个解决方法似乎是使FooImpl ComVisible,但标记其构造函​​数内部,这可以防止客户端能够CoCreate它,但这并不优雅.

我正在使用Visual Studio 2005,.net 2在WinXP SP3上运行,并且能够在VirtualBox上完全全新安装TinyXP(都使用Windows Script Host 5.7)以及使用Windows 7 Ultimate进行重现.net SDKs 2.0,3.0,3.5和4.0(WSH 5.8).所有操作系统都是32位.

库代码:

using System;
using System.Runtime.InteropServices;

[assembly: ComVisible(false)]

namespace jstest
{
    [ComVisible(true)]
    public interface ICreateFoos
    {
        IFoo CreateFoo(int …
Run Code Online (Sandbox Code Playgroud)

javascript c# com vbscript ole

6
推荐指数
1
解决办法
1217
查看次数

如何在Delphi的OLE自动化过程中使Word不可见

从我们的应用程序,我们使用OLE自动化来构建一个相当复杂的Word文档.我希望在制作文档时使Word不可见,因为有很多粘贴和插入需要相当长的时间.

我使用以下代码建立Word连接:

function ConnectToWord : TWordAutomationResult;
begin
  WordApp := TWordApplication.Create(nil);

  try
    WordApp.Connect;
    WordApp.Visible := false; 
  except on E: Exception do
    begin
      Result := waeErrorConnectingToWord;
      exit;
    end;
  end;
end;      
Run Code Online (Sandbox Code Playgroud)

我使用以下代码打开现有文档,然后由我的应用程序编辑.

function TWordAUtomation.OpenDocument(aFileName: string) : WordDocument;
var vFileName,
    vConfirmConversions,
    vReadOnly,
    vAddToRecentFiles,
    vPasswordDocument,
    vPasswordTemplate,
    vRevert,
    vWritePasswordDocument,
    vWritePasswordTemplate,
    vFormat,
    vEncoding,
    vVisible,
    vOpenConflictDocument,
    vOpenAndRepair,
    vWdDocumentDirection,
    vNoEncodingDialog  : OleVariant;
begin
  Result := nil;
  if not FileExists(aFileName) then exit;

  vFileName                := aFileName;
  vConfirmConversions      := True;
  vReadOnly                := False;
  vAddToRecentFiles        := False;
  vPasswordDocument        := EmptyParam;
  vPasswordTemplate        := EmptyParam; …
Run Code Online (Sandbox Code Playgroud)

delphi ole ms-word

6
推荐指数
1
解决办法
2794
查看次数

将System.Drawing.Bitmap转换为stdole.StdPicture

我当前有一个System.Drawing.Bitmap,我需要将其转换为stdole.StdPicture.
目前我正在使用:

var pic = (stdole.StdPicture)Microsoft.VisualBasic.Compatibility.VB6.Support.ImageToIPicture
                   (MyDLL.Properties.Resources.Img); // this is a System.Drawing.Bitmap
Run Code Online (Sandbox Code Playgroud)

但我收到编译器警告:

警告'Microsoft.VisualBasic.Compatibility.VB6.Support.ImageToIPicture(System.Drawing.Image)'已过时:'"Microsoft.VisualBasic.Compatibility.*类已过时,仅在32位进程中受支持.http:// go. microsoft.com/fwlink/?linkid=160862

那么使用什么呢?我找不到另一个解决方案......

c# compatibility interop ole

6
推荐指数
1
解决办法
5594
查看次数

如何正确使用TForm中的TOleContainer中的Word,布局方式?

我想知道在TForm中嵌入和控制MS Word的建议方法是什么?目前,我(1)在TForm上放了两个TPanel.该alBottomTPanel有一个TButton的,而alClientTPanel有alNoneTOleContainer.(2)在TMainForm.FormCreate事件处理程序中设置布局.

问题是MS Word喜欢占用其父表单的所有空间.只有如下所示的第四种方式似乎给出了可接受的布局.基于反复试验,似乎有必要使用子表单而不是TPanel来托管TOleContainer.(另外,Windows.SetParent似乎是必要的.)我想知道子表单是否是正确的方法?

PS:Delphi XE,Word 2010,Windows 7

PS:与"托管外部应用程序"相关的网页:

Binh Ly的网站

黛博拉的网站

如何shell到另一个应用程序并让它以delphi形式出现

重新审视TOleContainer

在delphi中打开word文档?

德尔福与Word(SimpChn)

PS:与"面板形式(子表格)"相关的网页:

如何在Panel中制作透明表格?

Delphi - OleContainer - PowerPoint - AutoPlay

FreePascal/Lazarus MultiDoc

TForm在一个小组中

如何创建包含多个"子"表单的delphi表单,这些表单可以移动/调整大小并显示激活状态

示例代码

unit uMainForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtnrs, ExtCtrls, StdCtrls;

type
  TMainForm = class(TForm)
    PanelOle: TPanel;
    PanelBtn: TPanel;
    OleContainer1: TOleContainer;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { …
Run Code Online (Sandbox Code Playgroud)

delphi layout ole ms-word

6
推荐指数
1
解决办法
1万
查看次数

Excel 2010 自动化常量在 Delphi XE7 中不起作用

我正在尝试将程序从 Delphi 2010 转换为 Delphi XE7(32 位/windows VCL)。曾经在 D2010 中通过后期绑定 OLE 自动化 Excel 的代码现在在 Delphi XE7 中给出异常“无法设置应用程序类的窗口状态属性”,当应用程序最大化或最小化时。

我从具有这些常量的 ExcelXP 单元中获取常量 xlmaximized 和 xlminimized: xlMaximized = $FFFFEFD7; xlMinimized = $FFFFEFD4;

但是,如果我使用简单的常量值 -4137 和 -4140,程序确实可以正常工作。我意识到我必须做一些简单的事情是错误的。

下面是一些说明问题的示例代码。我对此进行了测试,它在 Delphi 2010 中有效,但在 Delphi XE7 中无效。我想这一定与新版本中如何处理常量有关(?)有人能指出我正确的方向吗?提前致谢!

//XLA is a global variable of type OLEVariant;
//Program uses ComObj and ExcelXP unit

//This proc just runs or connects to Excel

procedure TForm3.RunExcelClick(Sender: TObject);

begin
  try
    xla := GetActiveOLEObject('Excel.Application');
  except
    try
      xla := CreateOleObject('Excel.Application');
    except
      on E: Exception do …
Run Code Online (Sandbox Code Playgroud)

delphi excel ole delphi-2010 delphi-xe7

6
推荐指数
1
解决办法
1419
查看次数

sp_OAGetProperty 返回 NULL,OUT 变量声明为 MAX

我有以下问题:

在一个函数中,我使用 OLE 对象来发出 HTTP 请求。函数声明如下:

function [dbo].[FN_GetRequestHTTP](@url varchar(2048), @reponseType varchar(10) = 'text')
returns @responseTable table
(
    StatusCode nvarchar(32),
    StatusText nvarchar(32),
    ResponseText nvarchar(max),
    SpErrorMessage varchar(max)
) as
begin
    declare @responseText nvarchar(4000);
    declare @ret int;
    declare @status nvarchar(32);
    declare @statusText nvarchar(32);
    declare @spErrorMessages nvarchar(4000);
    declare @token int;

    -- Open the connection
    exec @ret = sp_OACreate 'MSXML2.ServerXMLHTTP', @token out;

    if @ret <> 0
    begin
        insert into @responseTable (spErrorMessage)
        values ('Unable to open HTTP connection');

        return;
    end

    -- Send the request
    exec @ret …
Run Code Online (Sandbox Code Playgroud)

sql t-sql ole function xmlhttprequest

6
推荐指数
1
解决办法
5808
查看次数