---
product: Chilkat
product_version: 11.7.0
language: pascal
language_label: Lazarus Pascal
class: Dns
license: bundle
deprecated: false
reference_html: https://www.chilkatsoft.com/refdoc/pascal_DnsRef.html
---
# Chilkat Dns — Lazarus Pascal — v11.7.0

> Chilkat 11.7.0 · language=pascal · class=Dns
> Other versions: replace `11.7.0` in this URL. Other languages: `https://www.chilkatsoft.com/ai-docs/v/11.7.0/<lang>/classes/Dns.md`.
> Language-wide rules (install, unlock, error model, strings/bytes): `https://www.chilkatsoft.com/ai-docs/v/11.7.0/pascal/guide.md`.

## Purpose

**Configure DNS resolution and query DNS records directly from Chilkat.**

`Chilkat.Dns` is a focused class for DNS configuration and DNS record querying. It allows applications to control the nameservers used by Chilkat, query common DNS record types into JSON, configure DNS-over-TLS preference, set DNS query timeouts, and obtain useful diagnostics through `LastErrorText`.

**DNS record queries**

Query common DNS record types and receive structured JSON results that are easy to inspect or pass to other application logic.

**Nameserver control**

Configure the nameservers Chilkat uses instead of relying only on the operating system's default DNS configuration.

**DNS-over-TLS preference**

Prefer DNS-over-TLS when appropriate for applications that need encrypted DNS lookups.

**Timeout settings**

Control how long DNS queries may wait before failing, which is useful for responsive applications and troubleshooting.

**Application-wide behavior**

Nameserver settings affect DNS resolution across Chilkat classes, not only the current `Dns` object.

**Diagnostics**

Use `LastErrorText` to troubleshoot DNS configuration, lookup failures, timeout problems, or nameserver connectivity issues.

**Common pattern:** Use `Dns` either to perform direct DNS lookups, or to configure the DNS behavior used by Chilkat as a whole. Because nameserver changes can affect DNS resolution across Chilkat classes, treat them as application-wide configuration rather than object-local state.

For an extended overview, see [Dns Class Overview](https://www.chilkatsoft.com/dns_class_overview.asp).

## Object creation, unlocking and error handling

**Create / Free**

```pascal
uses
  Chilkat.Dns;

var
  obj: TDns;
begin
  obj := TDns.Create;
  try
    if not obj.IsValid then
      raise Exception.Create('Failed to create a TDns instance.');

    // ... use obj ...

  finally
    obj.Free;
  end;
end;
```

`constructor Create;`

Allocates the underlying CkDns object and returns a new TDns instance. Simply adding **Chilkat.Dns** to the unit's `uses` clause is enough to locate and bind to the Chilkat shared library (DLL / .so / .dylib) at runtime — no separate load step is required. Check `obj.IsValid` after calling `Create`; it is `False` if the underlying library could not be found/loaded or the object could not be allocated (for example, when unlicensed).

`destructor Destroy; override;`

Every TDns created by calling `Create` should eventually be released by calling `.Free` (inherited from `TObject`). The destructor automatically disposes the underlying CkDns handle. A native (unmanaged) memory leak occurs if the object is never freed.

Call `Global.UnlockBundle` once at the start of the program, before using this or any other Chilkat class. Any string unlocks a fully functional 30-day trial; a purchased unlock code is used in production. See `guide.md` for the exact code in Lazarus Pascal.

## Members common to every Chilkat class

Documented once per language in `common-members.md`; listed here so this page is self-contained.

| Property | Signature | Access | Meaning |
|---|---|---|---|
| `DebugLogFilePath` | `property DebugLogFilePath: string read GetDebugLogFilePath write SetDebugLogFilePath;` | read/write | If set to a file path, this property logs the LastErrorText of each Chilkat method or property call to the specified file. |
| `LastErrorHtml` | `property LastErrorHtml: string read GetLastErrorHtml;` | read-only | Provides HTML-formatted information about the last called method or property. |
| `LastErrorText` | `property LastErrorText: string read GetLastErrorText;` | read-only | Provides plain text information about the last called method or property. |
| `LastErrorXml` | `property LastErrorXml: string read GetLastErrorXml;` | read-only | Provides XML-formatted information about the last called method or property. |
| `LastMethodSuccess` | `property LastMethodSuccess: Boolean read GetLastMethodSuccess write SetLastMethodSuccess;` | read/write | Indicates the success or failure of the most recent method call: `True` means success, `False` means failure. |
| `VerboseLogging` | `property VerboseLogging: Boolean read GetVerboseLogging write SetVerboseLogging;` | read/write | If set to `True`, then the contents of LastErrorText (or LastErrorXml, or LastErrorHtml) may contain more verbose information. |
| `Version` | `property Version: string read GetVersion;` | read-only | Version of the component/library, such as "10.1.0" |

## Member index

| Member | Kind | Signature |
|---|---|---|
| `HeartbeatMs` | property, read/write | `property HeartbeatMs: Integer read GetHeartbeatMs write SetHeartbeatMs;` |
| `MaxWaitMs` | property, read/write | `property MaxWaitMs: Integer read GetMaxWaitMs write SetMaxWaitMs;` |
| `NumNameservers` | property, read-only | `property NumNameservers: Integer read GetNumNameservers;` |
| `TlsPref` | property, read/write | `property TlsPref: Integer read GetTlsPref write SetTlsPref;` |
| `UncommonOptions` | property, read/write | `property UncommonOptions: string read GetUncommonOptions write SetUncommonOptions;` |
| `AddDefaultNameservers` | method | `procedure AddDefaultNameservers;` |
| `AddNameserver` | method | `procedure AddNameserver(const ipAddr: string;     supportsTls: Boolean);` |
| `GetNameserver` | method | `function GetNameserver(index: Integer): string;` |
| `Query` | method | `// answer is a TJsonObject object. function Query(const recordType: string;     const domain: string;     answer: TChilkatBase): Boolean;` |
| `RemoveAllNameservers` | method | `procedure RemoveAllNameservers;` |
| `RemoveNameserver` | method | `procedure RemoveNameserver(const ipAddr: string);` |

## Properties

### Dns.HeartbeatMs

`Chilkat 11.7.0 · pascal · Dns · HeartbeatMs · property · read/write · since 9.5.0.96`

```pascal
property HeartbeatMs: Integer read GetHeartbeatMs write SetHeartbeatMs;
```

**Full documentation for this property (same in every language):** [Event Callback Examples](https://www.chilkatsoft.com/ai-docs/v/11.7.0/articles/event_callback_examples.md)

The interval in milliseconds between each `AbortCheck` event callback, which enables an application to abort certain method calls before they complete. **By default, HeartbeatMs is set to** `0`**, meaning no AbortCheck event callbacks will trigger.**

### Dns.MaxWaitMs

`Chilkat 11.7.0 · pascal · Dns · MaxWaitMs · property · read/write · since 9.5.0.96`

```pascal
property MaxWaitMs: Integer read GetMaxWaitMs write SetMaxWaitMs;
```

The maxiumum number of milliseconds to wait for the answer to a DNS query. A value of 0 is to wait indefinitely (no timeout). It's not a good idea to specify 0 (infinite timeout) or a value less than 1000 (1 second). The default value is 10000 milliseconds.

### Dns.NumNameservers

`Chilkat 11.7.0 · pascal · Dns · NumNameservers · property · read-only · since 9.5.0.96`

```pascal
property NumNameservers: Integer read GetNumNameservers;
```

The number of nameservers currently being used by Chilkat for DNS queries in all objects/classes, such as for HTTP, Email, FTP, SSH, etc.

### Dns.TlsPref

`Chilkat 11.7.0 · pascal · Dns · TlsPref · property · read/write · since 9.5.0.96`

```pascal
property TlsPref: Integer read GetTlsPref write SetTlsPref;
```

Specifies the TLS preference. Possible values are:

- 0 = No TLS
- 1 = Prefer TLS if possible.
- 2 = Require TLS

The default value is 0. If TLS is preferred then DNS nameservers with TLS capability will be tried first. If none succeed, then UDP/TCP will be tried. If TLS is required, then only TLS capable nameservers will be tried and all DNS queries will use TLS.

Note: To use TLS, your application needs to first specify nameservers by calling AddNameserver once per nameserver with the supportsTls argument set to `True`.

### Dns.UncommonOptions

`Chilkat 11.7.0 · pascal · Dns · UncommonOptions · property · read/write · since 11.4.0`

```pascal
property UncommonOptions: string read GetUncommonOptions write SetUncommonOptions;
```

This is a catch-all property to be used for uncommon needs. This property defaults to the empty string and should typically remain empty.

## Methods

### Dns.AddDefaultNameservers

`Chilkat 11.7.0 · pascal · Dns · AddDefaultNameservers · method · since 9.5.0.96`

```pascal
procedure AddDefaultNameservers;
```

Adds the default (auto-assigned) nameservers to the collection of nameservers used by Chilkat for DNS queries and domain to IP address lookups.

### Dns.AddNameserver

`Chilkat 11.7.0 · pascal · Dns · AddNameserver · method · since 9.5.0.96`

```pascal
procedure AddNameserver(const ipAddr: string;
    supportsTls: Boolean);
```

Adds a new nameserver to the collection of nameservers used by Chilkat for DNS queries and domain to IP address lookups. The `ipAddr` specifies the IPv4 address of the nameserver. The `supportsTls` indicates if the namserver supports DoT (DNS over TLS. DoT uses port 853 for encrypted DNS communication.) If the TlsPreference property is set to 1 or 2, then Chilkat will use TLS nameservers.

### Dns.GetNameserver

`Chilkat 11.7.0 · pascal · Dns · GetNameserver · method · since 9.5.0.96`

```pascal
function  GetNameserver(index: Integer): string;
```

Returns the IP address of the Nth nameserver currently used by Chilkat for DNS queries and domain to IP address lookups. The `index` specifies the index of the nameserver. The 1st nameserver is at `index` 0.

Returns True for success, False for failure.

### Dns.Query

`Chilkat 11.7.0 · pascal · Dns · Query · method · since 9.5.0.96`

```pascal
// answer is a TJsonObject object.

function  Query(const recordType: string;
    const domain: string;
    answer: TChilkatBase): Boolean;
```

Performs an DNS query for `domain` and returns the answer in `answer`. The type of DNS query is specified in `recordType` and can be A, AAAA, ALIAS, CAA, MX, NS, SOA, TXT. Additional record types can be added as needed.

### Dns.RemoveAllNameservers

`Chilkat 11.7.0 · pascal · Dns · RemoveAllNameservers · method · since 9.5.0.96`

```pascal
procedure RemoveAllNameservers;
```

Removes all nameservers from the collection of nameservers used by Chilkat. An application can call this method to reset to 0 nameservers before adding new nameservers. If a DNS domain to IP address resolution is needed by Chilkat, then the auto-assigned nameserver IP addresses will be automaticaly restored.

### Dns.RemoveNameserver

`Chilkat 11.7.0 · pascal · Dns · RemoveNameserver · method · since 9.5.0.96`

```pascal
procedure RemoveNameserver(const ipAddr: string);
```

Removes a nameserver from the collection of nameservers used by Chilkat. The `ipAddr` is the IPv4 address of the nameserver to be removed.

## Events and callbacks

Chilkat for Pascal supports three synchronous event callbacks: `OnAbortCheck`, `OnPercentDone`, and `OnProgressInfo`. Each is a property of the class; assign a method of one of your own objects (an *of object* handler) to receive the callbacks, or assign `nil` to unhook. The handler types are declared in the `Chilkat.Base` unit:

```pascal
TChilkatAbortCheckEvent   = function(Sender: TChilkatBase): Boolean of object;
TChilkatPercentDoneEvent  = function(Sender: TChilkatBase; PctDone: Integer): Boolean of object;
TChilkatProgressInfoEvent = procedure(Sender: TChilkatBase; const Name, Value: string) of object;
```

All Chilkat methods are synchronous, so callbacks are invoked on the thread that called the method -- if the method was called from the main thread, it is safe to access UI elements from the handler. The `HeartbeatMs` property controls the frequency of `OnAbortCheck` callbacks (the default of 0 means no AbortCheck events fire). Returning `True` from an `OnAbortCheck` or `OnPercentDone` handler aborts the running method.

### Dns.AbortCheck (event)

`Chilkat 11.7.0 · pascal · Dns · AbortCheck · event`

```pascal
// TChilkatAbortCheckEvent = function(Sender: TChilkatBase): Boolean of object;

property OnAbortCheck: TChilkatAbortCheckEvent;
```

Enables a method call to be aborted by triggering the AbortCheck event at intervals defined by the `HeartbeatMs` property. If HeartbeatMs is set to its default value of 0, no events will occur. For instance, set HeartbeatMs to 200 to trigger 5 AbortCheck events per second.

**Event callback implementation:**

```pascal
// A handler is a method of one of your own classes, e.g. a form:
function TMyObject.DnsAbortCheck(Sender: TChilkatBase): Boolean;
begin
  // Called every HeartbeatMs milliseconds while a method is running.
  // Return True to abort the method; return False to continue.
  Result := False;
end;
```

**To add an event handler:**

```pascal
dns := TDns.Create;
dns.HeartbeatMs := 250;   // fire OnAbortCheck 4 times per second
dns.OnAbortCheck := MyObject.DnsAbortCheck;
```

### Dns.PercentDone (event)

`Chilkat 11.7.0 · pascal · Dns · PercentDone · event`

```pascal
// TChilkatPercentDoneEvent = function(Sender: TChilkatBase; PctDone: Integer): Boolean of object;

property OnPercentDone: TChilkatPercentDoneEvent;
```

This provides the percentage completion for any method involving network communications or time-consuming processing, assuming the progress can be measured as a percentage. This event is triggered only when it's possible and logical to express the operation's progress as a percentage. The `pctDone` argument will range from 1 to 100. For methods that finish quickly, the number of PercentDone callbacks may vary, but the final callback will have `pctDone` equal to 100. For longer operations, callbacks will not exceed one per percentage point (e.g., 1, 2, 3, ..., 98, 99, 100).

The PercentDone callback also acts as an `AbortCheck` event. For fast methods where PercentDone fires, an AbortCheck event may not trigger since the PercentDone callback already provides an opportunity to abort. For longer operations, where time between PercentDone callbacks is extended, AbortCheck callbacks enable more responsive operation termination.

To abort the operation, set the `abort` output argument to `True`. This will cause the method to terminate and return a failure status or corresponding failure value.

**Event callback implementation:**

```pascal
// A handler is a method of one of your own classes, e.g. a form:
function TMyObject.DnsPercentDone(Sender: TChilkatBase; PctDone: Integer): Boolean;
begin
  // PctDone ranges from 1 to 100.
  WriteLn('Percent done: ', PctDone);
  // Return True to abort the method; return False to continue.
  Result := False;
end;
```

**To add an event handler:**

```pascal
dns := TDns.Create;
dns.OnPercentDone := MyObject.DnsPercentDone;
```

### Dns.ProgressInfo (event)

`Chilkat 11.7.0 · pascal · Dns · ProgressInfo · event`

```pascal
// TChilkatProgressInfoEvent = procedure(Sender: TChilkatBase; const Name, Value: string) of object;

property OnProgressInfo: TChilkatProgressInfoEvent;
```

This event callback provides `tag name`/value pairs that detail what occurs during a method call. To discover existing tag names, create code to handle the event, emit the pairs, and review them. Most tag names are self-explanatory.

Note: Some Chilkat methods don't fire any ProgressInfo events.

**Event callback implementation:**

```pascal
// A handler is a method of one of your own classes, e.g. a form:
procedure TMyObject.DnsProgressInfo(Sender: TChilkatBase; const Name, Value: string);
begin
  WriteLn(Name, ': ', Value);
end;
```

**To add an event handler:**

```pascal
dns := TDns.Create;
dns.OnProgressInfo := MyObject.DnsProgressInfo;
```

## Related classes

[`JsonObject`](https://www.chilkatsoft.com/ai-docs/v/11.7.0/pascal/classes/JsonObject.md)

