2012-02-11 13 views
13

मेरे पास कस्टम बाइनरी संसाधन (एनिमेटेड कर्सर) हैं जो विजुअल स्टूडियो सी ++ में स्थिर lib में संसाधनों के रूप में स्टोर करना चाहते हैं। यह पता चला है कि कस्टम बाइनरी संसाधन :: LoadCursor() द्वारा लोड नहीं होंगे या :: FindResource() द्वारा पाए जाते हैं यदि यह एक कस्टम संसाधन है और एक स्थिर पुस्तकालय में है।एक डीएल के हिस्से के रूप में एक वीसी ++ स्थिर पुस्तकालय में एक कस्टम बाइनरी संसाधन कैसे लोड करें?

This question कुछ काम देता है।

इसकी सलाह के बाद, यदि मैं * .res फ़ाइल को "कॉन्फ़िगरेशन प्रॉपर्टी-> लिंकर-> अतिरिक्त निर्भरता" के रूप में एक्सई में जोड़ता हूं तो स्थिर पुस्तकालय संसाधन ढूंढ पाएगा।

लेकिन यदि स्थिर पुस्तकालय एक डीएल का हिस्सा है और मैं इसे अतिरिक्त निर्भरता के रूप में जोड़ता हूं तो यह फिर से नहीं मिलता है!

मैं संसाधनों को एक डीएल में कैसे जोड़ सकता हूं?

या बस बाइनरी को स्थिर lib में पाया जाए? प्रश्न में विधियां बहुत बोझिल हैं।

+0

यह बहुत अस्पष्ट है कि आप DLL प्रोजेक्ट में आवश्यक .res फ़ाइल को जोड़ना भूल गए हैं या नहीं। सबसे सामान्य विफलता मोड FindResource() को गलत मॉड्यूल हैंडल पास कर रहा है। यह डीएलएल का मॉड्यूल हैंडल होना चाहिए। आप इसे DllMain() से प्राप्त करते हैं। और हाँ, इसे एक साथ gluing डिजाइन द्वारा बोझिल है। –

उत्तर

29

संसाधन जोड़ें संवाद में आयात करें पर क्लिक करें, "सभी फ़ाइलें ()" ताकि यह आपको किसी भी प्रकार की फ़ाइल आयात करने की अनुमति दे, और उसके बाद बस उस फ़ाइल का चयन करें जिसे आप चाहते हैं। जब कस्टम संसाधन प्रकार संवाद पॉप अप होता है, तो "संसाधन प्रकार" फ़ील्ड में RCDATA टाइप करें।

आप फ़ाइल आर सी खोलते हैं, तो आप कुछ इस तरह देखेंगे:

///////////////////////////////////////////////////////////////////////////// 
// 
// RCDATA 
// 

IDR_RCDATA1   RCDATA    "myfile.whatever" 

और यह निम्नलिखित लाइन के साथ resource.h उत्पन्न करेगा:

#define IDR_RCDATA1     101 

कोड में आप इसे इस तरह का उपयोग :

#include "resource.h" 
#include <windows.h> 

int main(int argc, char* argv[]) 
{ 
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); 
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource); 
    void* pMyBinaryData = ::LockResource(myResourceData); 
    return 0; 
} 

जहां pmyBinaryData इस निष्पादन योग्य के पहले बाइट के लिए सूचक है। अधिक जानकारी के लिए पर जाएँ Resource Functions

यहाँ एक उदाहरण है कि कैसे आप डिस्क पर इस तरह द्विआधारी संसाधन की बचत होगी: (

#include "resource.h" 
#include <windows.h> 
#include <fstream> 

int main(int argc, char* argv[]) 
{ 
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA); 
    unsigned int myResourceSize = ::SizeofResource(NULL, myResource); 
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource); 
    void* pMyBinaryData = ::LockResource(myResourceData); 

    std::ofstream f("C:\\x.bin", std::ios::out | std::ios::binary); 
    f.write((char*)pMyBinaryData, myResourceSize); 
    f.close(); 

    return 0; 
} 

जब आप ऐसे ही संसाधन के साथ इस परियोजना का निर्माण, इस संसाधन अपने कार्यक्रम का हिस्सा बन जाएगा dll)।

+0

और संसाधन को अनलॉक करना भी न भूलें: 'BOOL bResult = :: अनलॉक रिसोर्स (एचआरईएस); 'और' bResult = :: फ्री रिसोर्स (एचआरईएस); ' – DitherSky

+11

@DitherSky: नहीं। अब इसकी आवश्यकता नहीं है, दस्तावेज़ीकरण की जांच करें [फ्री रिसोर्स फ़ंक्शन] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648044 (v = vs.85) .aspx): * "यह फ़ंक्शन अप्रचलित है और केवल पिछड़ा संगतता के लिए समर्थित है 16-बिट विंडोज़ के साथ। 32-बिट विंडोज अनुप्रयोगों के लिए, लोडरसोर्स का उपयोग करके लोड किए गए संसाधनों को मुक्त करना जरूरी नहीं है। "* – LihO

+0

'अनलॉक रिसोर्स' एसडीके में सिर्फ एक नो-ऑप मैक्रो है, फिर भी अजीब रूप से 'फ्री रिसोर्स' असली है बैककंप के लिए 'kernel32' पर नो-ऑप निर्यात। – wqw