2010-05-31 5 views
9

यहाँ एक ClickMouse() फ़ंक्शन के लिए मेरे कोड है:सी # - PInvokeStackImbalance एक अच्छी तरह से प्रलेखित समारोह पर पता चला?

PInvokeStackImbalance was detected Message: A call to PInvoke function 'WindowsFormsApplication1!WindowsFormsApplication1.Form1::mouse_event' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

कृपया मदद: जब मेरे कार्यक्रम के लिए इस कोड की बात आती है,

[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
    public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo); 


    private const long MOUSEEVENTF_LEFTDOWN = 0x02; 
    private const long MOUSEEVENTF_LEFTUP = 0x04; 
    private const long MOUSEEVENTF_RIGHTDOWN = 0x08; 
    private const long MOUSEEVENTF_RIGHTUP = 0x10; 
    private void ClickMouse() 
    { 
     long X = Cursor.Position.X; 
     long Y = Cursor.Position.Y; 
     mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0); 

    } 

कुछ कारण से, यह इस त्रुटि संदेश फेंकता है?

+2

VB6 घोषणाओं से दूर रहें, वे .NET कोड के लिए सही नहीं हैं। –

उत्तर

3

मैं इस घोषणा

[DllImport("user32.dll")] 
static extern void mouse_event(uint dwFlags, 
    uint dx, 
    uint dy, 
    uint dwData, 
    IntPtr dwExtraInfo); 
13

लग रहा है अपने DllImport घोषणा की तरह गलत है पाया। विशेष रूप से UInt32 के बजाय Int64 (longs) का उपयोग।

यहाँ PInvoke संदर्भ से कुछ विस्तार से बताया गया है:
http://www.pinvoke.net/default.aspx/user32.mouse_event

[DllImport("user32.dll")] 
static extern void mouse_event(uint dwFlags, uint dx, uint dy, 
           uint dwData,UIntPtr dwExtraInfo); 
+0

धन्यवाद, यह मेरे लिए बहुत अच्छा काम करता है। –

+0

@ सॉटॉट मैं वीबी से सी # के साथ जुगल कर रहा हूं। नेट ने तीसरे पक्ष को अपग्रेड किया। डीएल। अपने दस्तावेज़ के आधार पर, सभी पैरामीटर मूल वीबी प्रोग्राम में वीबी 6 लंबे प्रकार के होते हैं। नेट अपग्रेडर ने उन्हें 'int' में बदल दिया है। स्पष्ट मुद्दा था, एक पासवर्ड है जो 8 अंक होना चाहिए और यह int32 प्रकार की क्षमता से परे है। तो हमने इसे सी # में लंबे समय तक बदल दिया। लेकिन समस्या यह है कि, मुझे एक विशेष फ़ंक्शन का उपयोग करते समय त्रुटि से ऊपर मिल रहा है जो स्मृति को एक्सेस/संशोधित करने का प्रयास कर रहा है। क्या हमें अभी भी 'यूंट' का उपयोग करना चाहिए? – bonCodigo

+0

प्रलेखन से एक नोट: "PInvokeStackImbalance एमडीए केवल 32-बिट x86 प्लेटफॉर्म के लिए लागू किया गया है।" – David

3

मैं निम्न स्वरूप का उपयोग RealGetWindowClass उपयोग कर रहा था।

[DllImport("User32", CallingConvention=CallingConvention.Cdecl)] 
public static extern int RealGetWindowClass(IntPtr hwnd, StringBuilder pszType, int cchType); 

और मैं 'PInvokeStackImbalance' अपवाद/त्रुटि प्राप्त कर रहा था। लेकिन जब मैंने कॉलिंग कन्वेंशन को

[DllImport("User32", CallingConvention=CallingConvention.StdCall)] 

त्रुटि को दूर कर दिया। मैं 64 बिट मशीन पर वीएस -2010 का उपयोग कर रहा हूं।

+2

Win32 API फ़ंक्शन कभी भी 'Cdecl' नहीं होते हैं; हमेशा 'StdCall' का उपयोग करें, जो डिफ़ॉल्ट है। –

+0

कोडी, उस जानकारी के लिए धन्यवाद। –

+0

मैंने कॉलिंग कॉन्फ़्रेंस = कॉलिंग कॉन्फ़्रेंस.सीडीसीएल का उपयोग किया। त्रुटि चली गई :)। धन्यवाद –

1

मैंने "सीडीसीएल" को "स्टडकॉल" में बदल दिया लेकिन यह काम नहीं किया।

स्कॉट वेनस्टीन के रूप में उल्लेख किया गया है कि हमें int प्रकार का उपयोग करना चाहिए।

प्रेस: ​​

[DllImport("user32.dll")] 
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); 

[Flags] 
public enum MouseEventFlags 
{ 
    LEFTDOWN = 0x00000002, 
    LEFTUP = 0x00000004, 
    MIDDLEDOWN = 0x00000020, 
    MIDDLEUP = 0x00000040, 
    MOVE = 0x00000001, 
    ABSOLUTE = 0x00008000, 
    RIGHTDOWN = 0x00000008, 
    RIGHTUP = 0x00000010 
} 

public static void LeftClick(int x, int y) 
{ 
    Cursor.Position = new System.Drawing.Point(x, y); 
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); 
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0); 
} 
2

PInvokeStackImbalance त्रुटि को ठीक करने CTRL + एएलटी +

के तहत "सहायकों डिबगिंग प्रबंधित" सही का निशान हटाएँ PInvokeStackImbalance

+6

यह त्रुटि को ठीक नहीं कर रहा है। यह अनदेखा कर रहा है। –

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