我正在努力将基于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) 是否可以在Java中使用OLE自动化?如果没有,为什么在Java中不可能?
我希望自动导出不同格式的excel电子表格(即.csv等...)
在此先感谢您的答案:)
你知道为什么下面的代码块会在某些计算机上否定"无法将类型(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)
非常感谢你的帮助.
我正在编写一个从 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) 考虑下面给出的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) 从我们的应用程序,我们使用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) 我当前有一个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
那么使用什么呢?我找不到另一个解决方案......
我想知道在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:与"托管外部应用程序"相关的网页:
PS:与"面板形式(子表格)"相关的网页:
Delphi - OleContainer - PowerPoint - AutoPlay
如何创建包含多个"子"表单的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 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) 我有以下问题:
在一个函数中,我使用 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) ole ×10
delphi ×4
c# ×3
excel ×2
ms-word ×2
.net ×1
automation ×1
com ×1
delphi-2010 ×1
delphi-xe2 ×1
delphi-xe7 ×1
function ×1
interop ×1
java ×1
javascript ×1
layout ×1
mathml ×1
mfc ×1
ms-access ×1
sql ×1
t-sql ×1
vbscript ×1
wmi ×1