2011-04-07 12 views
9

पर एक्सपोज़ करना मैंने यूएसबी पर सॉफ़्टवेयर सुरक्षा डोंगल तक पहुंचने के लिए सी ++ कक्षा विकसित की है। सी ++ क्लास को लिनक्स के तहत जी ++ के साथ विकसित किया गया है, लेकिन मैं इसे विंडोज़ के तहत मिनीजीडब्लू का उपयोग करके सफलतापूर्वक संकलित कर सकता हूं। मेरे पास एक वैज्ञानिक अनुप्रयोग है जो वीबी 6 (विजुअल बेसिक 6) के साथ बनाया गया है।एक आईबीओ सी ++ कक्षा को एक वीबी 6 एप्लिकेशन

सवाल यह है कि मैं अपने सी ++ वर्ग को वीबी 6 ऐप में कैसे दिखा सकता हूं? ऐसा करने के संभावित तरीके क्या हैं? क्या मुझे COM का उपयोग करने की ज़रूरत है? (ठीक है, एक "माइक्रोसॉफ्ट-कम" समाधान अधिक बेहतर है :)

आपकी मदद बहुत सराहना की है!

अपडेट 1. अपनी टिप्पणियां पढ़ना मुझे एहसास हुआ कि मुझे सी ++ कक्षा में एक COM wrapper को लागू करने की आवश्यकता है। क्या कोई अच्छा और हालिया उदाहरण हैं? क्या मैं MinGW (और एमएसवीसी से परहेज) का उपयोग कर COM wrapper को कार्यान्वित कर सकता हूं?

अद्यतन 2. अंत में, मैंने इस प्रश्न के लिए एक उपहार देने का फैसला किया। नीचे वे चीजें हैं जिन्हें मैं बेहतर समझना चाहता हूं:

1. मुझे एहसास हुआ कि मुझे अपने सी ++ वर्ग में एक COM wrapper को लागू करने की आवश्यकता है। किसी को इस तरह से एक वर्ग के लिए यह कैसे बनाने के लिए पर उदाहरण काम कर प्रदान करें कर सकते हैं:

class ValueMapper 
{ 
public: 
    ValueMapper() { } 

    ValueMapper(double fmin, double fmax, int ilength) { 
     SetMapping(fmin, fmax, ilength); 
    } 

    inline double GetMin() { return min; } 
    inline double GetMax() { return max; } 
    inline int GetLength() { return length; } 

    virtual inline void SetMapping(double fmin, double fmax, int ilength) 
    { 
     min = fmin; 
     max = fmax; 
     length = ilength; 
    } 

    virtual inline int MapValue(double value) { 
     double factor = length/(max - min); 
     return (int)RoundTo((value-min) * factor); 
    } 

    static double RoundTo(double value, double eps = 1) { 
     return floor(value/eps + 0.5) * eps; 
    } 

protected: 
    double min; 
    double max; 
    int  length; 
}; 

2. कैसे VB6 से उत्पन्न COM आवरण उपयोग कैसे करें? क्या मुझे एक COM सर्वर पंजीकृत करने की आवश्यकता है या नहीं? क्या मैं पंजीकरण के बिना इसका उपयोग कर सकता हूं?

3. वैकल्पिक। क्या MinGW का उपयोग कर एक COM wrapper को कार्यान्वित करना संभव है?

1) अपने वर्ग और VB6 से सीधे पहुँच के चारों ओर एक COM आवरण लिखें:

+1

बहुत से संभावित डुप्लीकेट: http://stackoverflow.com/search?q=vb6+call+c%2B%2B – fazo

+4

[विजुअल बेसिक के साथ उपयोग के लिए डीएलएल विकसित करने के लिए नोट्स] (http: //vb.mvps। संगठन/टिप्स/vb5dll.asp) –

+1

आप COM से बचने की कोशिश क्यों कर रहे हैं? वीबी 6 पूरी तरह से COM विकास में फैला हुआ है। कल्पना करना मुश्किल है कि आप "माइक्रोसॉफ्ट-कम" समाधान का उपयोग करने की कोशिश में क्या हासिल करते हैं। यदि आप चाहते थे, तो आप एक वीबी 6 आवेदन नहीं लिखेंगे या इसे विंडोज़ पर नहीं चलाएंगे। –

उत्तर

5

वहाँ दो संभव तरीके मैं के बारे में पता कर रहा हूँ कर रहे हैं।

2) अपनी कक्षा का एक सी इंटरफ़ेस बनाएं (इसे "फ़्लैटन करके") और इसे एक सादे डीएलएल में बेनकाब करें।

पूर्व दृष्टिकोण अधिक आम है, लेकिन ऐसा लगता है जैसे आप बाद वाले को पसंद कर सकते हैं।

+0

आपके उत्तर के लिए धन्यवाद। मुझे लगता है कि एक COM wrapper लिखना कम दर्दनाक होगा ?! – ezpresso

+4

@ezpresso: यह वास्तव में इस बात पर निर्भर करता है कि आप किसके साथ अधिक आरामदायक हैं। वास्तव में यदि आप मिंगडब्लू का उपयोग कर रहे हैं, तो एक COM घटक लिखना मुश्किल नहीं हो सकता है। –

8

विजुअल बेसिक से COM C++ क्लास तक पहुंच बनाने के लिए आपको मेटा-भाषा नामक मेटा-भाषा में अपना इंटरफ़ेस निर्दिष्ट करना होगा। इसका उपयोग टाइप लाइब्रेरी जेनरेट करने के लिए किया जाएगा जिसे विज़ुअल बेसिक और क्लास कंकाल में सी ++ में पढ़ा जाएगा जैसे कि वैल्यूमैपर ऑब्जेक्ट पर कॉल का प्रतिनिधि। यह midl.exe नामक उपकरण द्वारा किया जाता है। यह विंडोज प्लेटफार्म एसडीके या किसी भी वीसी ++ पर्यावरण के साथ आता है। यदि आपके पास कोई स्वामित्व नहीं है तो आप इसे मुफ्त में वीसी ++ 10 एक्सप्रेस संस्करण के साथ डाउनलोड कर सकते हैं।

आईडीएल फ़ाइल के लिए तुम देखो की तरह कर सकता है आपत्ति:

import "oaidl.idl"; 
[ 
uuid(C6907FD4-9F56-499A-A784-6168AB3352D6), 
version(1.0), 
local, 
oleautomation 
] 
interface IValueMapper : IDispatch 
{ 
    [id(1), propget] double Min(); 
    [id(2),propget] double Max(); 
    [id(3),propget] int Length(); 
    [id(4)] void SetMapping([in] double fmin, [in] double fmax, [in] int ilength); 
    [id(5)] int MapValue([in] double value); 
    [id(6)] double RoundTo([in] double value,[in,defaultvalue(1)] double eps); 
}; 

[ 
    uuid(1C110E43-A56F-41A2-8052-EF85FF96082F), 
    version(1.0), 
    helpstring("Value Mapper Library"), 
] library ValueMapperLib 
{ 
    importlib("stdole32.tlb"); 
    interface IValueMapper; 
    [ 
    uuid(D1A2F830-994E-4495-A9C3-1440155578A9), 
    helpstring("Value Mapper Component Class") 
    ] 
    coclass ValueMapperClassObject 
    { 
    [default] interface IValueMapper; 
    }; //end coclass def 
}; 

अब आप आवश्यक कार्यक्षमता IValueMapper से एक वर्ग पाने से प्रदान करते हैं और एक ValueMapper सदस्य का उपयोग करके अपनी कार्यक्षमता को लागू कर सकते हैं। दुर्भाग्यवश आपको क्लास ऑब्जेक्ट को लागू करने के लिए कुछ बॉयलरप्लेट कोड और IU अज्ञात और IDISpatch इंटरफेस के साथ-साथ डीएलएल पंजीकरण कोड भी प्रदान करने की आवश्यकता होगी। आप इंटरनेट पर प्रासंगिक कोड स्निपेट पा सकते हैं यानी।, पर पृष्ठों की तरह:

http://www.dcl.hpi.uni-potsdam.de/LV/Components04/VL5/MSDN/DrGUI-on-COM.html http://www.codeproject.com/KB/COM/simplecomserver.aspx

इसके अलावा, मैं एक कुलपति ++ 10 पूरा परियोजना है कि इस इंटरफेस को लागू करता है तो मुझे पता है अगर आप इसे पर एक नज़र डालें करना चाहते हैं इकट्ठा है।

+0

आपके उत्तर के लिए धन्यवाद! क्या सी ++ क्लास हेडर से आईडीएल फ़ाइल बनाने का कोई तरीका है? वीबी 6 प्रोजेक्ट में परिणामस्वरूप COM ऑब्जेक्ट DLL का उपयोग करने के लिए मुझे हमेशा एक .tlb फ़ाइल प्रदान करने की आवश्यकता है? – ezpresso

+0

चूंकि आईडीएल में क्लास हेडर की तुलना में अधिक जानकारी होती है जैसे मार्किंग इन, पैरामीटर आउटपुट आमतौर पर मानक क्लास हेडर से उत्पन्न करना संभव नहीं होता है। क्लास इंटरफेस के बारे में जानने के लिए वीबीबी द्वारा लाइब्रेरी की आवश्यकता होती है लेकिन यह मिडल कंपाइलर द्वारा स्वचालित रूप से जेनरेट की जाती है और वीबी द्वारा पढ़ी जाती है। तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है। – jszpilewski

+0

ठीक है, मुझे लगता है कि मुझे यह मिल गया है। इसलिए मुझे (1) इंटरफ़ेस के विवरण के साथ एक आईडीएल फ़ाइल बनाने की आवश्यकता है, (2) midl.exe उपयोगिता का उपयोग कर एक C++ शीर्षलेख उत्पन्न करें, (3) संबंधित COM ऑब्जेक्ट को लागू करें, (4) इसे एक डीएलएल फ़ाइल में संकलित करें, (5) वीबी 6 अनुप्रयोग में मेरी COM ऑब्जेक्ट का उपयोग करने के लिए आईडीएल से एक .tlb फ़ाइल जेनरेट करें, (6) एक वीबी 6 प्रोजेक्ट में .tlb आयात करें। सही? – ezpresso