2011-01-10 7 views
9

मैं एक्सेल VBA से अपने ही सी ++ dll समारोह कॉल करना चाहते हैं:एक्सेल वीबीए से सी ++ में पॉइंटर का संदर्भ पास करना संभव है?

void my_cpp_fun (int& n_size, double*& my_array); 

सी ++ समारोह चर आकार n_size की एक सरणी my_array (इस आकार my_cpp_fun भीतर गणना की जाती है) पैदा करता है।

क्या मैं अपने सी ++ कोड में किसी एक्सेल विशिष्ट सामग्री का उपयोग किये बिना इस कार्य को वीबीए के रूप में इंटरफ़ेस कर सकता हूं?

तो बुनियादी तौर पर मैं क्या देख रहा हूँ एक VBA तरह

Declare Sub my_cpp_fun Lib "my_cpp.dll" (n_size As Long, Ref_to_Ptr_Qualifier my_array As Double) 

घोषित बयान एक अतिरिक्त समस्या यह है कि सिर्फ मेरे लिए हुआ है: यदि मैं ग अंदर स्मृति को आबंटित ++ dll नए का उपयोग कर, कि स्मृति एक बार उपलब्ध हो जाएगा डीएलएल समारोह वीबी को नियंत्रण देता है? अगर ऐसा नहीं है, ऊपर व्यर्थ है ...

उत्तर

6

लघु जवाब आपके VBA में लोड करने के लिए आवश्यकता होगी: हाँ, यह है वीबीए से डीएलएल में कार्यों को कॉल करने के लिए संभव है (और मेरी राय में COM मार्ग से आसान)। मेरे अनुभव में, जाने का सबसे अच्छा तरीका है C लिंकेज (विभिन्न सी ++ नाम-मैंगलिंग योजनाओं में भागने से बचने के लिए) और रेफरेंस के बजाए पॉइंटर्स का इंटरफेस उजागर करने के लिए रैपर फ़ंक्शंस लिखना (उचित VBA प्रकार के रूप में संदर्भ तर्क घोषित करना या परिणाम भविष्यवाणी करना मुश्किल होगा)।

उचित Declare कथन (32-बिट विंडोज़ मानते हुए) लिखने के लिए एक महान मार्गदर्शिका "हार्डकोर विजुअल बेसिक" पुस्तक का अध्याय 2 है, यदि आप इसे पा सकते हैं।

ध्यान दें कि Declare कथन के माध्यम से वीबीए के संपर्क में आने वाले किसी भी कार्य को stdcall (उर्फ WINAPI) कॉलिंग सम्मेलन का उपयोग करने की आवश्यकता होगी।

TLDR:

मैं यह कर चाहते हैं:

 
extern 'C' { 
    void WINAPI my_cpp_fun_wrapper (int *n_size, double **my_array) 
    { 
     my_cpp_fun(*n_size, *my_array); 
    } 
} 

और फिर

Declare Sub my_cpp_fun_wrapper Lib "my_cpp.dll" (ptr_n_size As Long, ptr_ptr_my_array As Long)

और VB6/VBA के विभिन्न *Ptr कार्यों का उपयोग करने के लिए संकेत प्राप्त करने के लिए मेरी डेटा।

1

आप एक COM वस्तु अपने कार्य को उजागर करता है कि बना सकते हैं और का उपयोग कर CreateObject

+1

तो यह एक्सेल एपीआई का उपयोग कर के बिना संभव नहीं है? मैं की तरह कुछ सरल की सोच रहा था (लांग, Magic_Ref_to_ptr_qualifier my_array डबल के रूप में के रूप में n_size) – Hans

+0

घोषित उप my_cpp_fun लिब "my_cpp.dll" यह संभव है, लेकिन यह तरीका है उस मार्ग पर जाने के लायक होने की तुलना में अधिक परेशानी। वीबी के साथ इंटरफेसिंग करते समय COM कच्चे डीएल को लपेटना बहुत आसान है। –

+3

नहीं, यदि इंटरफ़ेस का सतह क्षेत्र छोटा है तो घोषणा COM से आसान है। COM पीछे की तरफ एक शाही दर्द है, खासकर सी ++ से। –

संबंधित मुद्दे