2014-01-13 45 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}」屬性

相關問題