标签: com4j

通过COM4J从.NET方法返回接口数组

如何通过COM4J从C#方法返回一个对象数组(实现COM接口)到Java方法?

示例C#生成数组的类:

using System;
using System.Runtime.InteropServices;

namespace Example
{

    [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IAnimal
    {
        string Speak();
    }

    [ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IFarm
    {
        [return:MarshalAs(UnmanagedType.SafeArray,
        SafeArraySubType=VarEnum.VT_UNKNOWN)]
        IAnimal[] GetAnimals();
    }

    [ComVisible(true), ClassInterface(ClassInterfaceType.None)]
    public class Farm : IFarm
    {
        public IAnimal[] GetAnimals()
        {
            return new IAnimal[] { new Cow(), new Pig() };
        }
    }

    internal class Cow: IAnimal
    {
        public string Speak()
        {
            return "Moo";
        }
    }

    internal class Pig: IAnimal
    {
        public string Speak()
        {
            return "Oink";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

生成的.tlb中的接口声明如下所示: …

c# java com com-interop com4j

19
推荐指数
1
解决办法
1364
查看次数

使用com4j连接到现有的iTunes实例

使用com4j和iTunes包装器,我可以启动iTunes的实例

 ClassFactory.createiTunesApp();
Run Code Online (Sandbox Code Playgroud)

从我的应用程序和成功使用api.

但是,如果iTunes已经独立运行,那么它就失败了

com4j.ExecutionException: com4j.ComException: 80080005 CoCreateInstance failed : Server execution failed : .\com4j.cpp:153
    at com4j.ComThread.execute(ComThread.java:236)
    at com4j.Task.execute(Task.java:26)
    at com4j.COM4J.createInstance(COM4J.java:99)
    at com4j.COM4J.createInstance(COM4J.java:74)
    at com.jthink.songkong.itunes.ClassFactory.createiTunesApp(ClassFactory.java:16)
    at com.jthink.songkong.ituneshelper.WindowsITunesModelCreator.createITunesModelInternal(WindowsITunesModelCreator.java:42)
    at com.jthink.songkong.ituneshelper.ITunesModelCreator.createITunesModel(ITunesModelCreator.java:263)
    at com.jthink.songkong.ituneshelper.ITunesModelCreator.run(ITunesModelCreator.java:227)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: com4j.ComException: 80080005 CoCreateInstance failed : Server execution failed : .\com4j.cpp:153
    at com4j.Native.createInstance(Native Method)
    at com4j.COM4J$CreateInstanceTask.call(COM4J.java:119)
    at com4j.COM4J$CreateInstanceTask.call(COM4J.java:106)
    at com4j.Task.invoke(Task.java:50)
    at com4j.ComThread.run0(ComThread.java:172)
    at com4j.ComThread.run(ComThread.java:153)
Run Code Online (Sandbox Code Playgroud)

因为iTunes已经在运行所以有没有办法可以连接到现有的iTunes实例,而不是在iTunes已经运行的情况下尝试创建一个新实例?

java com4j

9
推荐指数
1
解决办法
194
查看次数

ITunes似乎没有为其新的运动和工作领域公开COM接口

我使用Com4j让我的Java应用程序与Windows上的iTunes通信,我看到我生成的类不包含让我更新移动工作字段的方法,比如我可以更新其他字段,如艺术家专辑.

所以我重新使用了这些类

  c:\Code\jthink\opensrc\com4j-20120426-2>java -jar tlbimp.jar -o C:\Code\jthink\SongKong\src\main\java -p com.jthink.songkong.itunes  "C:\Program Files\iTunes\iTunes.exe"
Run Code Online (Sandbox Code Playgroud)

针对最新的12.6 iTunes exe,他们仍然不在这里.(我希望它们在IITFileOrCDTrack.java中)我做错了什么或者这是否意味着iTunes必须明确代码才能公开新字段并且他们决定不这样做.

那么这是否意味着iTunes必须明确地编写一个新的COM接口,以使其他程序可以访问这些字段

请注意,这些新字段可通过Mac机器上的applescript获得

com itunes com4j

8
推荐指数
1
解决办法
104
查看次数

如何在不提示的情况下使用com4j API保存excel工作簿

我正在尝试保存已自动修改的工作簿.这是一个例子:

import excel.*;
import com4j.Variant;
import static com4j.Variant.MISSING; 


public class ExcelDemo {
    public static void main(String[] args) {
    _Application app = excel.ClassFactory.createApplication();
    app.visible(0,false);

    //Variant readOnly = new Variant(Variant.Type.VT_BOOL);
    //readOnly.set(0);
    //Variant ignoreReadOnly = new Variant(Variant.Type.VT_BOOL);
    //ignoreReadOnly.set(1);
    //Variant saveBeforeExit = new Variant(Variant.Type.VT_BOOL);
    //saveBeforeExit.set(1);

    app.workbooks().open(
        "C:/dev/test.xlsx",
        MISSING, 
        MISSING, 
        MISSING, 
        MISSING,    
        MISSING,    
        MISSING,    
        MISSING, 
        MISSING,    
        MISSING,    
        MISSING,    
        MISSING, 
        MISSING,    
        MISSING,    
        MISSING,    
        0);
    app.calculate(0);
    app.save(MISSING,0);
    app.workbooks().close(0);
    //app.workbooks().close(saveBeforeExit,MISSING,MISSING);
}
Run Code Online (Sandbox Code Playgroud)

}

上面的代码是从一个ant文件运行并产生以下错误:

run:
 [java] Exception in thread "main" com4j.ComException: 800a03ec (Unknown error) : The file could not …
Run Code Online (Sandbox Code Playgroud)

java excel autosave com4j

5
推荐指数
1
解决办法
3059
查看次数

尝试使用com4j将文件中的图稿添加到iTunes IITrack对象时出现灾难性错误

将Com4j与iTunes一起使用,将各种文本值添加到IITrack对象没有问题,但是如果我尝试添加艺术作品

if(iTunesTrack.artwork().count()==0)
{
  String path = new File(new File(song.getFilename()).getParent(),"folder.jpg").getPath();
  if(Files.exists(Paths.get(path)))
  {
      iTunesTrack.addArtworkFromFile(path);
  }
}
Run Code Online (Sandbox Code Playgroud)

它失败了

11/05/2017 18.24.56:BST:com.jthink.songkong.ituneshelper.WindowsUpdateItunesWithChanges:updateITunesLibTrackFromSong:SEVERE:无法更新ItunesTrack C:\ Users\Paul\Desktop\TestMusic\WAV\Music \唱片三一学院\ Carols来自Trinity\27 - 在Dulci Jubilo(管风琴独奏).wav:8000ffff灾难性失败:灾难性失败com4j.Com例外:8000ffff灾难性失败:灾难性失败:.\ invoke.cpp:517 at com4j.Wrapper.invoke(Wrapper.java: 187)at com.sun.proxy.$ Proxy57.addArtworkFromFile(Unknown Source)at com.jthink.songkong.ituneshelper.WindowsUpdateItunesWithChanges.updateITunesLibTrackFromSong(WindowsUpdateItunesWithChanges.java:611)at com.jthink.songkong.ituneshelper.WindowsUpdateItunesWithChanges.addEditedTrack(WindowsUpdateItunesWithChanges .java:646)com.jthink.songkong.ituneshelper.WindowsUpdateItunesWithChanges.analyseFiles(WindowsUpdateItunesWithChanges.java:277)at com.jthink.songkong.ituneshelper.WindowsUpdateItunesWithChanges.updateItunes(WindowsUpdat)eItunesWithChanges.java:180)at com.jthink.songkong.ituneshelper.UpdateItunesWithChanges.call(UpdateItunesWithChanges.java:182)at com.jthink.songkong.ituneshelper.UpdateItunesWithChanges.call(UpdateItunesWithChanges.java:32)at java.util.concurrent来自java.util.conc.Thread上的java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源)的.futureTask.run(未知来源)java.lang.Thread.run上的java.man.run(未知来源)$(未知来源)引起:com4j.ComException:8000ffff灾难性故障:灾难性故障:.\ invoke.cpp:517 at com4j.Native.invoke(Native Method)at com4j.StandardComMethod.invoke(StandardComMethod.java:35)at com4j.Wrapper $ InvocationThunk .call(Wrapper.java:356)at com4j.Task.invoke(Task.java:50)at com4j.ComThread.run0(ComThread.java:172)at com4j.ComThread.run(ComThread.java:153)

COM4j接口是从我的iTunes版本构建的,所以它们存在,我不知道我做错了什么或者它是否坏了,我已经尝试过一些具有相同结果的jpogs.我检查文件是否存在,如果尝试添加不存在的文件,确实错误是不同的.

java com itunes com4j

5
推荐指数
0
解决办法
174
查看次数

在Java中使用带有WIA和com4j的COM对象

我是一个新手,我想问你是否可以推荐我一些文章,例子等开始与java应用程序中的扫描仪进行通信
我正在开发一个模块,应该与直接连接或在本地网络中连接的不同扫描仪进行通信.我希望WIA能够和com4j一起开始..
感谢大家的任何建议:)

编辑:我在这个Com4j教程中找到了一些信息,我需要从ocx文件生成一些java类型定义.
如果我理解它,这些生成的类将是我的客户端使用com4j获取扫描程序.但是我用的是什么ocx/dll文件呢?
有人有想法吗?

更新1:所以我设法让库生成包装类,它是wiaaut.dll(Windows Image Acquisition Automation Library)然后通过ClassFactory我创建了一个DeviceManager实例,但是它没有设备.. .
如何让deviceManager在本地网络上查看扫描仪?

更新2:所以我发现,我的HP LaserJet 2840无法通过win7 64位网络扫描...现在这个问题已经回答了,我应该自己发布答案并将其设置为接受,或者关闭此Q其他方式?谢谢

java wia com4j

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

标签 统计

com4j ×6

java ×5

com ×3

itunes ×2

autosave ×1

c# ×1

com-interop ×1

excel ×1

wia ×1