2017-07-17 4 views
0

i écrire ce code pour changer l'imprimante par défaut dans Windows et fonctionnent bien, mais dans reload le fichier INI une erreur c'est un code:applications VB.NET pour recharger le fichier INI

Private Sub SetDefaultPrinter(ByVal PrinterName As String, ByVal DriverName As String, ByVal PrinterPort As String) 
    Dim DeviceLine As String 

    'rebuild a valid device line string 
    DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort 

    'Store the new printer information in the 
    '[WINDOWS] section of the WIN.INI file for 
    'the DEVICE= item 
    Call WriteProfileString("windows", "Device", DeviceLine) 

    'Cause all applications to reload the INI file 
    Call SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, "windows") 

End Sub 

Private Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long 
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lparam As String) As Long 
Private Const HWND_BROADCAST As Long = &HFFFF& 
Private Const WM_WININICHANGE As Long = &H1A 

et c'est une erreur:

Un appel à la fonction PInvoke 'Test! Test.Form2 :: SendMessage' a déséquilibré la pile. Cela est probablement dû au fait que la signature PInvoke gérée ne correspond pas à la signature cible non gérée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

Est-ce que quelqu'un a une idée pour résoudre ce problème? Thankful

+0

www.pinvoke.net – Plutonix

+0

@Plutonix Pas grand-chose de recommander un site comme celui-là, tellement plein d'erreurs. –

Répondre

0
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (_ 
    ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ 
    ByVal lparam As String) As Long 

vos types de données sont erronées. Le paramètre hwnd est dimensionné avec un pointeur, wMsg est une valeur de 32 bits et wParam, lParam et la valeur de retour est dimensionnée par un pointeur. Notez que Long est un type 64 bits.

Il devrait plutôt

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (_ 
    ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, _ 
    ByVal lparam As String) As IntPtr 

Notez que je recommande que, dans les temps modernes, vous utilisez des déclarations PInvoke plutôt que Declare. Cela offre beaucoup plus de flexibilité.