首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从具有后期绑定的COM对象中获取类/类型

从具有后期绑定的COM对象中获取类/类型
EN

Stack Overflow用户
提问于 2014-01-13 23:40:44
回答 4查看 898关注 0票数 1

我在COM兼容性问题上有问题。这个链接已经非常有用了,COM interface Photoshop compatibility issue解释说,COM兼容性问题可以用后期绑定来解决。我已经尝试过了,但是现在我对如何使用以前通过COM对象访问的类型感到困惑。

原始代码:

代码语言:javascript
复制
//This works with late binding
m_Application = new Photoshop.Application();
var refe = new Photoshop.ActionReference();

refe.PutProperty(m_Application.CharIDToTypeID("Prpr"), m_Application.CharIDToTypeID("NmbL"));

//This is the problem area
var ColorlendMode = Photoshop.PsBlendMode.psColorBlend;

var visibleLayers = new List<Photoshop.ArtLayer>();

后期绑定代码:

代码语言:javascript
复制
//works...
dynamic m_Application = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Application"));
dynamic refe = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));

refe.PutProperty(m_Application.CharIDToTypeID("Prpr"), m_Application.CharIDToTypeID("NmbL"));

//PROBLEM:
//Doesn't compile
Type BlendModeType = Type.GetTypeFromProgID("Photoshop.PsBlendMode").psColorBlend;

//returns null
//Type BlendModeType = Type.GetTypeFromProgID("Photoshop.PsBlendMode");
//Type artLayerType = Type.GetTypeFromProgID("Photoshop.ArtLayer");

编译erorr是:

代码语言:javascript
复制
'System.Type' does not contain a definition for 'psColorBlend'

那么,如何获得我以前使用Photoshop COM对象获得的枚举PsBlendMode (在我的项目中作为引用添加)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-15 06:31:32

好吧,不同的想法:

只需定义您自己的枚举来表示PSColorBlen并使用它

代码语言:javascript
复制
public enum PsBlendMode
{
    psColorBlend = 22
}

var ColorlendMode = PsBlendMode.psColorBlend;

当您将int传递到调用中时,您可能不得不将其转换为int。

有关常量值的列表,请参见此处:http://fs.mis.kuas.edu.tw/~wchsieh/photoshopy9.py

票数 0
EN

Stack Overflow用户

发布于 2014-02-27 07:54:38

试试这个代码..。您将获得混合模式名为字符串类型。

代码语言:javascript
复制
 Public Enum EBlendModes
    None = 0
    psSoftLight = 13
    psScreen = 9
    psNormalBlend = 2
    psMultiply = 5
    psColorBurn = 6
    psDissolve = 3
    psHardMix = 26
    psHardLight = 14
    psDarken = 4
    psDifference = 18
    psColorBlend = 22
    psPinLight = 17
    psOverlay = 12
    psVividLight = 15
    psLighterColor = 27
    psLinearLight = 16
    psDarkerColor = 28
    psLinearDodge = 11
    psLinearBurn = 7
    psExclusion = 19
    psLuminosity = 23
    psSubtract = 29
    psPassThrough = 1
    psColorDodge = 10
    psDivide = 30
    psSaturationBlend = 21
    psLighten = 8
    psHue = 20
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Try
        Dim _appref = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Application"))
        Dim _blndmod As EBlendModes = CInt(_appref.activedocument.Activelayer.blendmode)
        MsgBox(_blndmod.ToString)
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

结果是:PsNormalBlend.你是否期望这样.

票数 3
EN

Stack Overflow用户

发布于 2014-01-14 01:53:06

我不认为你能做你想做的事。您能做的最接近的事情是使用反射循环遍历枚举,以找到您想要的字符串。

参见:http://www.codeproject.com/Tips/550160/Getting-enum-value-from-another-class-via-Reflecti

试着运行它,看看它是否打印出了psColorBlend的值

代码语言:javascript
复制
var fieldsArray = Type.GetTypeFromProgID("Photoshop.PsBlendMode").GetFields(BindingFlags.Public | BindingFlags.Static);

foreach (var fInfo in fieldsArray)
{
    var ulngValue = (ulong)Convert.ChangeType(fInfo.GetValue(null), typeof(ulong));
    Console.WriteLine(fInfo.Name.ToString(CultureInfo.InvariantCulture) + " : " + ulngValue.ToString(CultureInfo.InvariantCulture));
}  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21103540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档