2014-01-13 47 views
1

我遇到COM兼容性问题。该链接已经非常有用,COM interface Photoshop compatibility issue,解释COM后续绑定可以解决COM兼容性问题。我试过这个,但我现在困惑于如何使用我通过COM对象访问的类型。从COM对象获取具有后期绑定的类/类型

原始代码:

//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>(); 

后期绑定代码:

//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是:

'System.Type' does not contain a definition for 'psColorBlend' 

所以我如何才能枚举PsBlendMode,我用得到与Photoshop COM对象(在我的项目中添加为参考)?

回答

0

确定不同的想法:

只要定义自己的枚举代表PSColorBlen并使用它

public enum PsBlendMode 
{ 
    psColorBlend = 22 
} 

var ColorlendMode = PsBlendMode.psColorBlend; 

当您将它传递给一个调用时,您可能不得不将其转换为int。

看到这里为恒值的列表:http://fs.mis.kuas.edu.tw/~wchsieh/photoshopy9.py

+0

谢谢!这对于枚举来说是完美的! 对于有人建议的接口我试试这个:http://www.codeproject.com/Articles/10888/ SafeCOMWrapper管理一次性-强类型-S。 – VincentC

0

我不认为你可以做你想为枚举做什么。你可以做的最接近的是使用反射循环遍历枚举,找到你想要的一个字符串。

看到这个: http://www.codeproject.com/Tips/550160/Getting-enum-value-from-another-class-via-Reflecti

试运行,看看是否它打印出来psColorBlend值:

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

谢谢Iain!不幸的是Type.GetTypeFromProgID(“Photoshop.PsBlendMode”)返回null,所以它在.GetFields上崩溃。 是否有另一种方法可以解决COM兼容性问题?这将使我能够使用COM对象中的类型/类? (Photoshop.PsBlendMode(enum),Photoshop.ArtLayer(interface)。 – VincentC

3

试试这个代码..你将得到的混合模式Name为字符串类型..

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 ... 你是否期望像这样.............

0

如果没有任何文档或没有选择任何图层,您将无法获得混合模式值...您必须选择图层并那么你可以得到BlendMode值,否则你可以n不..因为BlendMode是一个“Artlayer {Interface}”属性

相关问题