Τρόπος χρήσης του API μητρώου για την αποθήκευση και ανάκτηση ρύθμιση

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 145679 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Παρόλο που η Visual Basic περιλαμβάνει λειτουργίες SaveSetting και GetSetting για την αποθήκευση και ανάκτηση πληροφοριών από το μητρώο, οι συναρτήσεις αυτές μόνο σε μια συγκεκριμένη ενότητα του μητρώου, η Visual Basic και VBA Ρυθμίσεις προγράμματος από το ριζικό κλειδί HKEY_CURRENT_USER.

Αυτό το άρθρο περιγράφει τη χρήση συναρτήσεις API των Windows 32-bit, οι οποίες μπορεί να είναι χρησιμοποιείται για τη ρύθμιση και την ανάκτηση τιμών από οπουδήποτε στο μητρώο. Τα θέματα και αναφορές της συνάρτησης σε αυτό το άρθρο μπορεί να είναι γενίκευση πρόγραμμα το 16-bit του μητρώου.

Οι συναρτήσεις API 32-bit περιλαμβάνουν επίσης υποστήριξη για την ασφάλεια, παρόλο που ένα Επισκόπηση της ασφάλειας είναι εκτός του πεδίου εφαρμογής του παρόντος άρθρου.

ΣΗΜΕΊΩΣΗ: Οι συναρτήσεις SaveSetting και GetSetting δεν αποτελούν μέρος της VBA Βιβλιοθήκη συναρτήσεων. Ωστόσο, το δείγμα κώδικα παρακάτω εξακολουθεί να ισχύει για 32-bit Οι εφαρμογές που υλοποιούν VBA.

Περισσότερες πληροφορίες

Γενικές πληροφορίες μητρώου

Το μητρώο χρησιμοποιείται από εφαρμογές και τα Windows για την αποθήκευση των παραμέτρων τα δεδομένα. Είναι αρχεία τα οποία αντικατάστασης για μεγάλους αριθμούς INI proliferated τα Windows 3.x μηχανές και χρησιμοποιείται επίσης ιδιαιτέρως από το OLE.

Το μητρώο είναι οργανωμένο με ιεραρχική σειρά κλειδιών και τιμών σε αυτό ένα δέντρο. Κάθε κλειδί, ξεκινώντας με μία από τις έξι προκαθορισμένες ρίζας κλειδιά, μπορεί να έχει sub-keys και τιμές που σχετίζονται με αυτό. Τα κλειδιά οργανωτικές και ονομασίας μονάδες και εμφανίζονται τα προγράμματα επεξεργασίας μητρώου των Windows ως φάκελοι αρχείων. Οι τιμές δεδομένων εγγραφές και εμφανίζονται ως καταχωρήσεις κειμένου του δεξιό τμήμα του παραθύρου του Επεξεργαστή μητρώου. Τα κλειδιά πρέπει έχουν οποιαδήποτε σχετική τιμές, αλλά μπορεί να έχει πολλές. Κάθε τιμή έχει έναν συσχετισμένο τύπο δεδομένων. Οι δύο Οι τύποι δεδομένων μητρώου που χρησιμοποιούνται πιο συχνά είναι REG_SZ, ένα μηδενικό συμβολοσειρά. και REG_DWORD, ένας αριθμός 32-bit.

Είναι η βασική διαδικασία που χρησιμοποιείται για την εγγραφή ή ανάγνωση από μια θέση στο μητρώο το ίδιο. Αναφοράς σε οποιαδήποτε δεδομένη κλειδί ή τιμή, πρέπει να έχετε ένα δείκτη χειρισμού το κλειδί. Μόλις λάβει αυτόν το δείκτη χειρισμού, τιμές και sub-keys το κλειδί που Αυτός ο δείκτης χειρισμού αναφέρεται μπορεί να διαβάσει, ορίστε ή αναφέρονται (με απαρίθμηση).

Δίνεται μια θέση στο μητρώο, για να αποκτήσετε μια λαβή σε αυτό το κλειδί, θα πρέπει να αρχίζει με ένα από τα έξι προκαθορισμένα κλειδιά (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG, και HKEY_DYN_DATA) και να διασχίσει το δέντρο μητρώου μέχρι το πλήκτρο που επιθυμείτε έφτασε. Προγράμματα χρήστη συχνότερα ανάγνωσης και εγγραφής από HKEY_CURRENT_USER και HKEY_LOCAL_MACHINE. Εάν τα κλειδιά που επιτρέπεται η διέλευση υπάρχει ήδη, μπορείτε να χρησιμοποιήσετε μια σειρά κλήσεις σε συναρτήσεις RegOpenKey ή RegOpenKeyEx. Εάν τα πλήκτρα πρέπει να δημιουργηθούν, οι συναρτήσεις RegCreateKey και RegCreateKeyEx να κάνετε την εργασία.

Με δείκτη χειρισμού για το κλειδί που θέλετε, τις συναρτήσεις που χρησιμοποιούνται για λίστα, ορίστε, και ανάκτηση πληροφοριών μπορεί να κληθεί. Σε όλες τις περιπτώσεις, οι συναρτήσεις με εκ των υστέρων επίθεμα θα λειτουργούν μόνο σε πλατφόρμες 32-bit. Μπορεί συναρτήσεις χωρίς το επίθεμα εργασία σε εκδόσεις 16 bit και 32-bit των Windows. Να θυμάστε ότι δεν όλες τις λειτουργίες μητρώου ανύπαρκτη επίθημα "Ex", οι συναρτήσεις που παρέχονται για συμβατότητα 16-bit. Το επίθημα Ex είχε προστεθεί μόνο όταν τις δυνατότητες του έχουν αναπτυχθεί συναρτήσεις 16-bit. Λειτουργίες που είναι εντελώς νέα και συγκεκριμένα σε πλατφόρμες 32-bit δεν διαθέτουν επέκταση εκ των υστέρων.

Οι συναρτήσεις RegSetValue και RegSetValueEx επιτρέπουν τις ρυθμίσεις μιας τιμής Για να τροποποιηθεί, ενώ ανάκτηση RegQueryValue και RegQueryValueEx το τρέχουσα ρύθμιση της τιμής. Περιορισμοί των εκδόσεων-Ex, 16-bit αυτά τα API είναι πολύ προφανές εδώ. Κατά τη χρήση RegSetValue 16-bit συνάρτηση δεν είναι Τρόπος όνομα τιμή και λόγω της RegSetValue αυτής, δεν είναι δυνατό να χρησιμοποιηθεί για να συσχετίσετε περισσότερες από μία τιμή με κάθε κλειδί. Επιπλέον, όλες οι τιμές εγγράφονται με RegSetValue έχει τύπο δεδομένων REG_SZ. Αυτές περιορισμοί είναι εγγενείς με το μητρώο 16-bit. RegSetValueEx επιτρέπει την Δημιουργία πολλαπλών αριθμό τιμών με οποιονδήποτε τύπο δεδομένων που είναι διαθέσιμη.

Τρόπος εγγραφής σε μια συγκεκριμένη θέση μητρώου

Μετά τον προσδιορισμό ποιες λειτουργίες που θα πρέπει να χρησιμοποιήσετε για το έργο σας αντίγραφο δηλώνει τη σχετική από τον κώδικα στο τέλος αυτού του άρθρου σε ένα βασική λειτουργική μονάδα. Τα δύο περιλαμβάνονται διαδικασίες της Visual Basic (SetValueEx και QueryValueEx) είναι προγράμματα εξομοίωσης για το RegSetValueEx και RegQueryValueEx API συναρτήσεις και απλοποιούν σημαντικά τη χρήση τους. Σημειώσεις κάτω από το να χρησιμοποιήσετε αυτών Συναρτήσεις της Visual Basic Ωστόσο, οι ελεύθερες κλήσεις απευθείας στο του API, εάν θέλετε.

Δημιουργία/τροποποίηση κλειδιών και τιμών:

Με τις δηλώσεις και διαδικασίες που είναι διαθέσιμες, μπορείτε να δημιουργήσετε και να ανοίξετε πλήκτρα, και προσθήκη, τροποποίηση και ανάγνωση τιμών. Οι ακόλουθες τρεις ενότητες εξηγούν πώς μπορείτε να δημιουργήσετε ένα κλειδί, να ορίσετε ή να τροποποιήσετε την τιμή και ερώτημα μια τιμή.

Δημιουργία νέου κλειδιού:

Δημιουργία νέου κλειδιού είναι τόσο απλή όσο χρησιμοποιώντας την ακόλουθη διαδικασία. CreateNewKey λαμβάνει το όνομα του κλειδιού για τη δημιουργία και τη σταθερά που αντιπροσωπεύει το προκαθορισμένο κλειδί για τη δημιουργία του κλειδιού στην περιοχή. Η κλήση RegCreateKeyEx δεν αξιοποιούν τους μηχανισμούς ασφαλείας επιτρέπεται, αλλά θα μπορούσε να τροποποιηθεί για να το κάνετε. Είναι μια συζήτηση ασφαλείας μητρώου εκτός του πεδίου εφαρμογής του παρόντος άρθρου.
   Private Sub CreateNewKey (sNewKeyName As String, lPredefinedKey As Long)
       Dim hNewKey As Long         'handle to the new key
       Dim lRetVal As Long         'result of the RegCreateKeyEx function

       lRetVal = RegCreateKeyEx(lPredefinedKey, sNewKeyName, 0&, _
                 vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, _
                 0&, hNewKey, lRetVal)
       RegCloseKey (hNewKey)
   End Sub
				

Μια κλήση από αυτήν τη διαδικασία:
   CreateNewKey "TestKey", HKEY_LOCAL_MACHINE
				

θα δημιουργήσετε ένα κλειδί που ονομάζεται TestKey αμέσως στην περιοχή HKEY_LOCAL_MACHINE.

Κλήση του CreateNewKey ως εξής:
      CreateNewKey "TestKey\SubKey1\SubKey2", HKEY_LOCAL_MACHINE
				

θα δημιουργήσετε ένθετα τρία κλειδιά που αρχίζουν με TestKey αμέσως στην περιοχή Δευτερεύον HKEY_CURRENT_USER, SubKey1 TestKey και SubKey3 στην περιοχή SubKey2.

Ρύθμιση/τροποποίησης μια τιμής:

Δημιουργία και ρύθμιση τιμής καθορισμένο κλειδί μπορεί να επιτευχθεί με η παρακάτω διαδικασία σύντομα. SetKeyValue λαμβάνει το κλειδί που η τιμή θα συσχετιστούν με το όνομα της τιμής, η ρύθμιση της τιμής και τον τύπο την τιμή (η συνάρτηση SetValueEx υποστηρίζει μόνο REG_SZ και REG_DWORD, αλλά αυτό μπορεί να τροποποιηθεί εάν είναι απαραίτητο). Καθορίζοντας μια νέα τιμή για ένα υπάρχον sValueName θα τροποποιήσετε την τρέχουσα ρύθμιση αυτής της τιμής.
   Private Sub SetKeyValue (sKeyName As String, sValueName As String, _
   vValueSetting As Variant, lValueType As Long)
       Dim lRetVal As Long         'result of the SetValueEx function
       Dim hKey As Long         'handle of open key

       'open the specified key
       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
                                 KEY_SET_VALUE, hKey)
       lRetVal = SetValueEx(hKey, sValueName, lValueType, vValueSetting)
       RegCloseKey (hKey)
   End Sub
				

Κλήση του:
   SetKeyValue "TestKey\SubKey1", "StringValue", "Hello", REG_SZ
				

θα δημιουργήσει μια τιμή REG_SZ που ονομάζεται "stringvalue" με τη ρύθμιση του τύπου "Hello". Αυτή η τιμή θα είναι συσχετισμένο με το κλειδί SubKey1 "testkey".

Σε αυτήν την περίπτωση, "testkey" είναι ένα κλειδί HKEY_CURRENT_USER, αλλά αυτό μπορεί να Τροποποίηση αλλάζοντας την κλήση RegOpenKeyEx. Αυτή η κλήση θα αποτύχει αν "testkey\subkey1" δεν υπάρχει. Για να αποφύγετε αυτό το ζήτημα, χρησιμοποιήστε μια κλήση RegCreateKeyEx αντί για μια κλήση RegOpenKeyEx. Θα ανοίξει RegCreateKeyEx το καθορισμένο κλειδί εάν υπάρχει ήδη.

Υποβολή ερωτημάτων σε μια τιμή:

Στην επόμενη διαδικασία μπορεί να χρησιμοποιηθεί για να βεβαιωθείτε ότι η ρύθμιση μιας υπάρχουσας η τιμή. QueryValue λαμβάνει το όνομα του κλειδιού και το όνομα της τιμής που σχετίζονται με αυτό το κλειδί και εμφανίζει ένα μήνυμα πλαίσιο με την αντίστοιχη η τιμή. Χρησιμοποιεί μια κλήση στη συνάρτηση wrapper QueryValueEx που ορίζεται κατωτέρω, που υποστηρίζει μόνο τύπους REG_SZ και REG_DWORD.
   Private Sub QueryValue (sKeyName As String, sValueName As String)
       Dim lRetVal As Long         'result of the API functions
       Dim hKey As Long         'handle of opened key
       Dim vValue As Variant      'setting of queried value

       lRetVal = RegOpenKeyEx(HKEY_CURRENT_USER, sKeyName, 0, _
   KEY_QUERY_VALUE, hKey)
       lRetVal = QueryValueEx(hKey, sValueName, vValue)
       MsgBox vValue
       RegCloseKey (hKey)
   End Sub
				

Με αυτήν τη διαδικασία, μια κλήση:
   QueryValue "TestKey\SubKey1", "StringValue"
				

θα εμφανιστεί ένα πλαίσιο μηνύματος με την τρέχουσα ρύθμιση "stringvalue" τιμή και θεωρείται ότι υπάρχει "stringvalue" στο κλειδί "testkey\subkey1".

Εάν δεν υπάρχει τιμή που υποβάλλετε ερώτημα, QueryValue θα επιστρέψει ένα κωδικός σφάλματος 2 - 'error_badkey'.

Πρόσθετες σημειώσεις:

Τα παραπάνω παραδείγματα χρησιμοποιούν το εκτεταμένο εκδόσεις 32-bit του μητρώου λειτουργεί αποκλειστικά. Αυτές οι συναρτήσεις επιτρέπει περισσότερες από μία τιμή είναι που σχετίζεται με κάθε κλειδί. Όπως αναφέρθηκε παραπάνω, RegSetValue 16-bit και Πράξη RegQueryValue σε μια μεμονωμένη τιμή που συσχετίζεται με το τρέχον κλειδί (το οποίο είναι πάντα του τύπου REG_SZ). Οι συναρτήσεις αυτές εμφανίζονται σε 32-bit Επεξεργαστής μητρώου με όνομα <no name="">. Για να ορίσετε, να τροποποιήσετε ή το ερώτημα αυτό ειδική συσχετισμένη τιμή μία πρέπει να χρησιμοποιήσετε τις λειτουργίες μητρώου 16-bit. Ανάγνωση και εγγραφή από το μητρώο σε ένα περιβάλλον 16 bit είναι πολύ απλούστερη από σε περιβάλλον 32 bit. Την ίδια βασική διαδικασία ακολουθείται: Ανοίξτε ένα κλειδί και λάβετε μια λαβή και, στη συνέχεια, κλήση σας συνάρτησης τροποποίηση με δείκτη χειρισμού, αλλά δεν λαμβάνονται υπόψη οι χρειάζεται να γίνει για πολλαπλούς συσχετισμένη τιμές ή τους τύπους δεδομένων διαφορετική τιμή. Να δημιουργήσετε μια εφαρμογή 16-bit και τροποποίηση κλειδιών και τιμών με τις δηλώσεις των RegCreateKey, Οι συναρτήσεις RegOpenKey, RegQueryValue, RegSetValue και RegCloseKey. </no>

Σε ορισμένες περιπτώσεις, υπάρχει ανάγκη για οποιεσδήποτε τιμές θα συσχετιστεί με ένα κλειδί. Μια εφαρμογή ενδέχεται να χρειάζεται μόνο να γνωρίζετε αν υπάρχει ορισμένων κλειδιού ή τιμής, και δεν μέριμνα σχετικά με τη φύση των τιμών του κλειδιού. Σε περίπτωση όπως αυτό, μπορεί να χρησιμοποιηθεί για τις συναρτήσεις RegEnumKey, RegEnumKeyEx και RegEnumValue Προσδιορίστε αν υπάρχει ορισμένων κλειδιού ή τιμής. Για περισσότερες πληροφορίες σχετικά με Αυτές οι λειτουργίες αναφέρονται αναφοράς API πρόγραμμα προβολής κειμένου ή/και Windows API.

Συνάρτηση API και σταθερή δηλώσεις

   Option Explicit

   Public Const REG_SZ As Long = 1
   Public Const REG_DWORD As Long = 4

   Public Const HKEY_CLASSES_ROOT = &H80000000
   Public Const HKEY_CURRENT_USER = &H80000001
   Public Const HKEY_LOCAL_MACHINE = &H80000002
   Public Const HKEY_USERS = &H80000003

   Public Const ERROR_NONE = 0
   Public Const ERROR_BADDB = 1
   Public Const ERROR_BADKEY = 2
   Public Const ERROR_CANTOPEN = 3
   Public Const ERROR_CANTREAD = 4
   Public Const ERROR_CANTWRITE = 5
   Public Const ERROR_OUTOFMEMORY = 6
   Public Const ERROR_ARENA_TRASHED = 7
   Public Const ERROR_ACCESS_DENIED = 8
   Public Const ERROR_INVALID_PARAMETERS = 87
   Public Const ERROR_NO_MORE_ITEMS = 259

   Public Const KEY_QUERY_VALUE = &H1
   Public Const KEY_SET_VALUE = &H2
   Public Const KEY_ALL_ACCESS = &H3F

   Public Const REG_OPTION_NON_VOLATILE = 0

   Declare Function RegCloseKey Lib "advapi32.dll" _
   (ByVal hKey As Long) As Long
   Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias _
   "RegCreateKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
   ByVal Reserved As Long, ByVal lpClass As String, ByVal dwOptions _
   As Long, ByVal samDesired As Long, ByVal lpSecurityAttributes _
   As Long, phkResult As Long, lpdwDisposition As Long) As Long
   Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias _
   "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, _
   ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As _
   Long) As Long
   Declare Function RegQueryValueExString Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As String, lpcbData As Long) As Long
   Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, lpData As _
   Long, lpcbData As Long) As Long
   Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias _
   "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
   String, ByVal lpReserved As Long, lpType As Long, ByVal lpData _
   As Long, lpcbData As Long) As Long
   Declare Function RegSetValueExString Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, ByVal lpValue As _
   String, ByVal cbData As Long) As Long
   Declare Function RegSetValueExLong Lib "advapi32.dll" Alias _
   "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _
   ByVal Reserved As Long, ByVal dwType As Long, lpValue As Long, _
   ByVal cbData As Long) As Long
				

SetValueEx και τις λειτουργίες εξομοίωσης QueryValueEx:
   Public Function SetValueEx(ByVal hKey As Long, sValueName As String, _
   lType As Long, vValue As Variant) As Long
       Dim lValue As Long
       Dim sValue As String
       Select Case lType
           Case REG_SZ
               sValue = vValue & Chr$(0)
               SetValueEx = RegSetValueExString(hKey, sValueName, 0&, _
                                              lType, sValue, Len(sValue))
           Case REG_DWORD
               lValue = vValue
               SetValueEx = RegSetValueExLong(hKey, sValueName, 0&, _
   lType, lValue, 4)
           End Select
   End Function

   Function QueryValueEx(ByVal lhKey As Long, ByVal szValueName As _
   String, vValue As Variant) As Long
       Dim cch As Long
       Dim lrc As Long
       Dim lType As Long
       Dim lValue As Long
       Dim sValue As String

       On Error GoTo QueryValueExError

       ' Determine the size and type of data to be read
       lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch)
       If lrc <> ERROR_NONE Then Error 5

       Select Case lType
           ' For strings
           Case REG_SZ:
               sValue = String(cch, 0)

   lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, _
   sValue, cch)
               If lrc = ERROR_NONE Then
                   vValue = Left$(sValue, cch-1)
               Else
                   vValue = Empty
               End If
           ' For DWORDS
           Case REG_DWORD:
   lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, _
   lValue, cch)
               If lrc = ERROR_NONE Then vValue = lValue
           Case Else
               'all other data types not supported
               lrc = -1
       End Select

   QueryValueExExit:
       QueryValueEx = lrc
       Exit Function

   QueryValueExError:
       Resume QueryValueExExit
   End Function
				

Αναφορές

Τα Windows 95 διασύνδεση χρήστη, κεφάλαιο 10 - προγραμματισμού "χρησιμοποιώντας το Μητρώου"

Για αναφορές της συνάρτησης: οποιοδήποτε Οδηγό Win16 ή Win32 API.

Ιδιότητες

Αναγν. άρθρου: 145679 - Τελευταία αναθεώρηση: Πέμπτη, 26 Μαΐου 2011 - Αναθεώρηση: 4.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic for Applications 6.0
Λέξεις-κλειδιά: 
kbcode kbhowto kbtophit kbmt KB145679 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:145679

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com