2011-09-24 11 views
5

मुझे DLL में एक समारोह है:कॉलिंग कस्टम बुला सम्मेलनों के लिए एक UnmanagedFunctionPointer सी में #

char __usercall MyUserCallFunction<al>(int arg1<esi>) 

क्योंकि मैं अपने आप को नफरत मैं पी का उपयोग कर/आह्वान सी # के भीतर से इस फोन करना चाहते हैं।

आम तौर पर यह एक समारोह प्रतिनिधि, एक ला रही द्वारा किया जा सकता:

[UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Auto, SetLastError = true)] 
    public delegate char DMyUserCallFunction(IntPtr a1); 

और फिर ऐसा करने से यह लागू:

var MyFunctionPointer = (DMyUserCallFunction)Marshal.GetDelegateForFunctionPointer(AddressOfFunction, typeof(DMyUserCallFunction)); 

MyFunctionPointer(IntPtr.Zero); 

सम्मेलनों बुला कस्टम उपयोगकर्ता के लिए, तथापि, इस कारण होगा क्रैश करने के लिए कार्यक्रम। क्या असुरक्षित कोड या कुछ प्रकार के रैपर फ़ंक्शन का उपयोग करके मैं ऐसा कुछ कर सकता हूं जो प्रतिनिधियों को जगह में रखता है, लेकिन मुझे सी ++ डीएलएल लिखने के लिए मजबूर नहीं करता है?

धन्यवाद!

संपादित करें:

DTB ने सुझाव दिया है, मैं एक बहुत छोटी सी ++ DLL मैं पी/आह्वान के माध्यम से उपयोग करें जो समारोह कॉल करने के लिए बनाया गया है।

extern "C" __declspec(dllexport) int __stdcall callUsercallFunction(int functionPointer, int arg1) 
{ 
    int retVal; 

    _asm 
    { 
     mov esi, arg1 
     call functionPointer 
     mov retVal, eax 
    } 

    //Fake returning al, the lower byte of eax 
    return retVal & 0x000000FF; 
} 
+5

+1 "क्योंकि मैं खुद से नफरत करता हूं" – dtb

+0

आपको प्रतिनिधि को बिल्कुल क्यों चाहिए? क्या आप '[DllImport (...)] सार्वजनिक बाहरी बाइट MyUserCallFunction (IntPtr a1)' नहीं कर सकते? – dtb

+0

फ़ंक्शन वास्तव में निर्यात नहीं किया जाता है। मुझे डीएलएल लोड करने वाली प्रक्रिया में इंजेक्शन करके फ़ंक्शन को कॉल करने की आवश्यकता है। मैं इसके लिए EasyHook का उपयोग कर रहा हूं - लक्ष्य डीएलएल के अंदर आईडीए का उपयोग करके किसी भी मनमानी फ़ंक्शन को हुक करना है। – mweber

उत्तर

2

कस्टम को लागू सी # में सम्मेलनों को बुलाने की कोई उम्मीद नहीं है: किसी को उत्सुक सी में समारोह के लिए ++ की तरह लग रही समाप्त होता है। आपको इसे देशी डीएलएल या सी ++/सीएलआई डीएलएल में करना होगा।

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