मुझे 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;
}
+1 "क्योंकि मैं खुद से नफरत करता हूं" – dtb
आपको प्रतिनिधि को बिल्कुल क्यों चाहिए? क्या आप '[DllImport (...)] सार्वजनिक बाहरी बाइट MyUserCallFunction (IntPtr a1)' नहीं कर सकते? – dtb
फ़ंक्शन वास्तव में निर्यात नहीं किया जाता है। मुझे डीएलएल लोड करने वाली प्रक्रिया में इंजेक्शन करके फ़ंक्शन को कॉल करने की आवश्यकता है। मैं इसके लिए EasyHook का उपयोग कर रहा हूं - लक्ष्य डीएलएल के अंदर आईडीए का उपयोग करके किसी भी मनमानी फ़ंक्शन को हुक करना है। – mweber