2012-08-01 46 views
5

संकलित करने के लिए हैलो मैं वर्तमान दृश्य स्टूडियो 2010 चल रहा हूँ और पूरी तरह से एक 32 बिट मशीन पर 32 बिट में काम कर रहा है ताकि सभी तरीके मौजूद एक संदर्भ मेनू शेल एक्सटेंशन की कोशिश कर त्रुटि C2259 फेंकता है। यह एक एटीएल परियोजना है। 32 बिट पर कोई त्रुटि या चेतावनी नहीं।32 बिट में वी.एस. कॉम परियोजना संकलन, लेकिन जब 64 बिट

यहां समस्या है। जब मैं विजुअल स्टूडियो के तहत कॉन्फ़िगरेशन मैनेजर में जाता हूं और Win32 से x64 तक सक्रिय समाधान प्लेटफ़ॉर्म स्विच करता हूं और संकलन करने का प्रयास करता हूं तो मुझे त्रुटि मिलती है "त्रुटि C2259: 'ATL :: CCOMObject: अमूर्त वर्ग को तत्काल नहीं कर सकता"।

चूंकि यह ठीक उसी परियोजना संकलन और 32 बिट में चलाने के कारण है कि यह मुझे 64 के लिए कि त्रुटि फेंक करता है?

किसी भी विचार या सही दिशा में एक बिंदु की सराहना की जाएगी।
मुख्य तरीके कि आवश्यक हैं और के रूप में लागू किया जाता है इस प्रकार है:

STDMETHODIMP Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY); 
STDMETHODIMP GetCommandString(UINT, UINT, UINT*, LPSTR, UINT); 
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO); 
STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT); 

बचाने के लिए कोड अंतरिक्ष एक Atl परियोजना बनाएँ। एक बार प्रारंभिक आइटम बनने के बाद एक नया वर्ग "टेस्टिंगिंग कॉन्टेक्स्टमेनू" जोड़ें, शेष कोड इस संदर्भ में होगा। बदली गई

stdafk.h

#include "resource.h" 
#include <atlbase.h> 
#include <atlcom.h> 
#include <atlctl.h> 
#include <shlobj.h> 
#include <comdef.h> 

#include <string> 
#include <list> 
typedef std::list< std::basic_string<TCHAR> > string_list; 

TestingContextMenu.h केवल भागों है कि जोड़ दिया गया है/

#include "stdafx.h" 
using namespace std; 
class ATL_NO_VTABLE CTestingContextMenu: 
     public CComObjectRootEx<CComSingleThreadModel>, 
    public CComCoClass<CTestingContextMenu, &CLSID_TestingContextMenu>, 
    public IShellExtInit, 
    public IContextMenu 
    { 
     // Comment out or remove IDispatch 
BEGIN_COM_MAP(CMainMagnimbusContextMenu) 
    //COM_INTERFACE_ENTRY(ITestingContextMenu) 
    //COM_INTERFACE_ENTRY(IDispatch) 
    COM_INTERFACE_ENTRY(IShellExtInit) 
    COM_INTERFACE_ENTRY(IContextMenu) 
END_COM_MAP() 

protected: 
    TCHAR m_szFile[MAX_PATH]; 
    list<string> Filenames; 
    list<string> FilenamesCopier; 
public: 
    STDMETHODIMP Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY); 

    STDMETHODIMP GetCommandString(UINT, UINT, UINT*, LPSTR, UINT); 
    STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO); 
    STDMETHODIMP QueryContextMenu(HMENU, UINT, UINT, UINT, UINT); 
}; //There is other code within this but it is autogenerated 

शामिल किया जाएगा TestingContextMenu.cpp

#include "stdafx.h" 
#include "TestingContextMenu" 
#include <sstream> 
using namespace std; 
#pragma comment(lib, "comsuppw") 

STDMETHODIMP CMainMagnimbusContextMenu::Initialize ( 
    LPCITEMIDLIST pidlFolder, 
    LPDATAOBJECT pDataObj, 
    HKEY hProgID) 
    { 
    FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
    STGMEDIUM stg = { TYMED_HGLOBAL }; 
    HDROP  hDrop; 

    if (FAILED(pDataObj->GetData (&fmt, &stg))) 
     return E_INVALIDARG; 
    hDrop = (HDROP) GlobalLock (stg.hGlobal); 

    UINT uNumFiles = DragQueryFile (hDrop, 0xFFFFFFFF, NULL, 0); 
    HRESULT hr = S_OK; 

    if (0 == uNumFiles) 
    { 
     GlobalUnlock (stg.hGlobal); 
     ReleaseStgMedium (&stg); 
     return E_INVALIDARG; 
    } 

    UINT counter = 0; 
    // Get the name of the every file and store it in our member variable m_szFile. 
    for(counter = 0; counter < uNumFiles; counter++) 
    { 
     if (0 == DragQueryFile (hDrop, counter, m_szFile, MAX_PATH)) 
     { 
      hr = E_INVALIDARG; 
     } 
     wchar_t* t = _wcsdup(m_szFile); 
     char ch[260]; 
     char DefChar = ' '; 
     WideCharToMultiByte(CP_ACP,0,t,-1, ch,260,&DefChar, NULL); 
     string ss(ch); 
     Filenames.push_back(ss); 
     FilenamesCopier.push_back(ss); 
    } 

    GlobalUnlock (stg.hGlobal); 
    ReleaseStgMedium (&stg); 

    return hr; 
} 

कार्य के बाकी अनुरोध पर उपलब्ध हैं। हालांकि मैंने कुछ नया देखा है। यदि आपके पास उपरोक्त फ़ंक्शन और कोड लागू है और कॉन्फ़िगर प्रबंधक x64 बनाने के लिए सेट है तो आपको प्रारंभिक त्रुटि मिल रही है। इसका मतलब है कि QueryContextMenu, GetCommandString, या invoke कमांड को लागू नहीं करना है। इस सेट अप के साथ आपको केवल त्रुटि ही मिल जाएगी, जो मूल है, जिसे हम उम्मीद करेंगे क्योंकि उन्हें लागू नहीं किया जाएगा। हालांकि उस कॉन्फ़िगरेशन प्रबंधक को Win32 पर वापस स्विच करें और आपको अपेक्षित त्रुटियां जैसे 3 अनसुलझा बाहरी, और 3 त्रुटियों को प्राप्त करने के बाद GetCommandString, InvokeCommand, और QueryContextMenu नामकरण प्राप्त करें। फिर से उम्मीद की जाती है कि अगर उन्हें लागू नहीं किया गया है, लेकिन x64 पर कंपाइलर केवल मेरी मूल त्रुटि को पहचानता है, जो कि बहुत से लोग मानते हैं कि यह लागू नहीं किया गया है, लेकिन Win32 सेट पर यह लागू होने पर पूर्ण त्रुटियों को दिखाता है।

पिछले पैराग्राफ बस कुछ मैंने देखा था। मेरे पास Win32 में सही ढंग से कार्यान्वित और संकलित सभी 3 विधियां हैं लेकिन x64 नहीं।

+0

बाकी त्रुटि संदेश क्या है? आम तौर पर अनुपूरक सदस्यों की एक सूची होती है। अन्यथा, एक न्यूनतम repro पोस्ट करें जो समस्या का प्रदर्शन करता है। –

+0

यह संपूर्ण त्रुटि संदेश है। इस लाइन पर altcom.h के भीतर होता है ATLTRY (पी = नया टी 1 (पीवी)) – Rob

+1

पूर्ण संदेश के लिए आउटपुट विंडो में देखें, यह आपको बताता है कि कक्षा का कौन सा सदस्य परेशानी है। –

उत्तर

6

आपका GetCommandString मापदंडों इंटरफेस विधि द्वारा परिभाषित विवरणों से मेल नहीं।

आपका

STDMETHODIMP GetCommandString(UINT, UINT, UINT*, LPSTR, UINT) 

STDMETHODIMP GetCommandString(UINT_PTR, UINT, UINT*, LPSTR, UINT) 

Win32 में बेमेल इतना महत्वपूर्ण नहीं है (पैरामीटर प्रकार एक ही प्रकार के हल) होने की जरूरत है, और x64 में महत्वपूर्ण हो जाता है। कंपाइलर बिल्ड आउटपुट ने आपको इस पर एक संकेत दिया होगा, जिसमें गायब विधि नाम शामिल है।

+0

वह मुद्दा था। त्रुटि कमांड स्ट्रिंग के लिए त्रुटि दिखाई नहीं दे रही थी। मैंने पैसेंट्स टिप्पणी पढ़ी और नई जानकारी जोड़ दी। आपके द्वारा सुझाए गए फ़िक्स का प्रयास करें और यह काम करता है। 64 बिट मशीन पर संकलन और प्रोग्राम का परीक्षण और संचालन किया गया है। इन त्रुटियों से सी ++ के बारे में बहुत कुछ सीखना। अगर मैं प्रतिनिधि था तो मैं आप और पासेंट दोनों को उखाड़ फेंक दूंगा। – Rob