Win32 API 日本語リファレンス
ホーム › NetworkManagement.Rras › RasDialDlgA

RasDialDlgA

関数
RAS接続のダイヤルダイアログを表示し接続を行う(ANSI版)。
DLLRASDLG.dll文字セットANSI (-A)呼出規約winapi対応OSWindows 2000 以降

シグネチャ

// RASDLG.dll  (ANSI / -A)
#include <windows.h>

BOOL RasDialDlgA(
    LPSTR lpszPhonebook,   // optional
    LPSTR lpszEntry,   // optional
    LPSTR lpszPhoneNumber,   // optional
    RASDIALDLG* lpInfo
);

パラメーター

名前型方向説明
lpszPhonebookLPSTRinoptional電話帳 (PBK) ファイルのフル パスとファイル名を指定する、null で終わる文字列へのポインター。このパラメーターが NULL の場合、関数は現在の既定の電話帳ファイルを使用します。既定の電話帳ファイルは、ダイヤルアップ ネットワーク ダイアログ ボックスの ユーザー設定 プロパティ シートでユーザーが選択したものです。
lpszEntryLPSTRinoptionalダイヤルする電話帳エントリの名前を指定する、null で終わる文字列へのポインター。
lpszPhoneNumberLPSTRinoptional電話帳エントリに格納されている番号を上書きする電話番号を指定する、null で終わる文字列へのポインター。このパラメーターが NULL の場合、 RasDialDlg は電話帳エントリ内の番号を使用します。
lpInfoRASDIALDLG*inout追加の入力および出力パラメーターを指定する RASDIALDLG 構造体へのポインター。この構造体の dwSize メンバーには sizeof(RASDIALDLG) を指定する必要があります。エラーが発生した場合、dwError メンバーにエラー コードが返されます。それ以外の場合は 0 が返されます。

戻り値の型: BOOL

公式ドキュメント

RasDialDlg 関数は、指定された電話帳エントリとログオン中のユーザーの資格情報を使用して RAS 接続を確立します。この関数は、接続操作の状態を示す一連のダイアログ ボックスを順に表示します。(ANSI)

戻り値

関数が RAS 接続を確立した場合、戻り値は TRUE です。それ以外の場合、関数は FALSE を返します。

エラーが発生した場合、RasDialDlg は RASDIALDLG 構造体の dwError メンバーに、Routing and Remote Access Error Codes または Winerror.h の値を設定します。

解説(Remarks)

RasDialDlg 関数は、ユーザーが ダイヤル ボタンを選択したときにメインの ダイヤルアップ ネットワーク ダイアログ ボックスが表示するものと同様の、一連のダイアログ ボックスを表示します。メインの電話帳ダイアログ ボックスを表示せずに接続操作の標準的なユーザー インターフェイスを表示するには、 RasDialDlg 関数を使用します。たとえば RAS AutoDial サービスは、リモート アドレスに関連付けられた電話帳エントリを使用して接続を確立するために、この関数を使用します。

RasDialDlg 関数は、接続操作中にダイアログ ボックスを表示し、操作の進行状況をユーザーにフィードバックします。たとえば、ダイヤル中であることや、リモート サーバーでユーザーの資格情報を認証中であることなどが示されます。これらのダイアログ ボックスには、ユーザーが操作を中止するための キャンセル ボタンも用意されています。

RasDialDlg は、接続が確立されたとき、またはユーザーが操作をキャンセルしたときに制御を返します。

次のサンプル コードは、変数 lpszEntry で指定された既定の電話帳内のエントリにダイヤルします。

注 この簡単なサンプルは、Windows Vista 以降のバージョンの Windows で実行することを想定しています。sizeof(RASENTRY) の呼び出しは、コードを実行するオペレーティング システムのバージョンによって異なる値を返す点に注意してください。これが適切に扱われるよう対策を講じてください。
#include <windows.h>
#include <stdio.h>
#include "ras.h"
#include "rasdlg.h"
#include <tchar.h>
#include "strsafe.h"

#define PHONE_NUMBER_LENGTH 7
#define DEVICE_NAME_LENGTH 5
#define DEVICE_TYPE_LENGTH 5

DWORD __cdecl wmain(){

    DWORD dwError = ERROR_SUCCESS;
    BOOL nRet = TRUE;
    LPTSTR lpszEntry = L"EntryName";
    LPTSTR lpszphonenumber = L"5555555";
    LPTSTR lpszdevicename = L"Modem";
    LPTSTR lpszdevicetype = RASDT_Modem;

    // Allocate heap memory and initialize RASENTRY structure
    LPRASENTRY lpentry = (LPRASENTRY)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RASENTRY));
    // Allocate heap memory and initialize RASDIALDLG structure
    LPRASDIALDLG lpInfo = (LPRASDIALDLG) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RASDIALDLG));
    
    if (lpentry == NULL || lpInfo == NULL){
        wprintf(L"HeapAlloc failed");
        HeapFree(GetProcessHeap(), 0, lpentry);
        HeapFree(GetProcessHeap(), 0, lpInfo);
        return 0;
    }

    // The RASDIALDLG and RASENTRY dwSize members have to be initialized or the RasDialDlg()
    // RasSetEntryProperties() APIs will fail below.
    lpInfo->dwSize = sizeof(RASDIALDLG);
    lpentry->dwSize = sizeof(RASENTRY);
    lpentry->dwFramingProtocol = RASFP_Ppp;
    lpentry->dwfOptions = 0;
    lpentry->dwType = RASFP_Ppp;
    dwError |= StringCchCopyN(lpentry->szLocalPhoneNumber, RAS_MaxPhoneNumber, lpszphonenumber, PHONE_NUMBER_LENGTH);
    dwError |= StringCchCopyN(lpentry->szDeviceName, RAS_MaxDeviceName, lpszdevicename, DEVICE_NAME_LENGTH);
    dwError |= StringCchCopyN(lpentry->szDeviceType, RAS_MaxDeviceType, lpszdevicetype, DEVICE_TYPE_LENGTH);
    
    if (dwError != S_OK){
        wprintf(L"Structure initialization failed: Error = %d\n", dwError);
        HeapFree(GetProcessHeap(), 0, lpentry);
        HeapFree(GetProcessHeap(), 0, lpInfo);
        return 0;
    }

    // Validate the new entry's name
    dwError = RasValidateEntryName(NULL, lpszEntry);
    if (dwError != ERROR_SUCCESS){
        wprintf(L"RasValidateEntryName failed: Error = %d\n", dwError);
        HeapFree(GetProcessHeap(), 0, lpentry);
        HeapFree(GetProcessHeap(), 0, lpInfo);
        return 0;
    }

    // Create and set the new entry's properties
    dwError = RasSetEntryProperties(NULL, lpszEntry, lpentry, lpentry->dwSize, NULL, 0);
    if (dwError != ERROR_SUCCESS){
        wprintf(L"RasSetEntryProperties failed: Error = %d\n", dwError);
        HeapFree(GetProcessHeap(), 0, lpentry);
        HeapFree(GetProcessHeap(), 0, lpInfo);
        return 0;
    }
    
    // Connect using the new entry
    nRet = RasDialDlg(NULL, lpszEntry, NULL, lpInfo);
    if (nRet != TRUE){
        wprintf(L"RasDialDlg failed: Error = %d\n", lpInfo->dwError);
    }
    
    // Clean up: delete the new entry
    dwError = RasDeleteEntry(NULL, lpszEntry);
    if (dwError != ERROR_SUCCESS){
        wprintf(L"RasDeleteEntry failed: Error = %d\n", dwError);
    }
    
    HeapFree(GetProcessHeap(), 0, lpentry);
    HeapFree(GetProcessHeap(), 0, lpInfo);

    return 0;
}
メモ

rasdlg.h ヘッダーは、UNICODE プリプロセッサー定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして RasDialDlg を定義しています。エンコード中立のエイリアスと、エンコード中立でないコードを混在させると、不一致が生じてコンパイル エラーや実行時エラーの原因となることがあります。詳細については、関数プロトタイプの規則 を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// RASDLG.dll  (ANSI / -A)
#include <windows.h>

BOOL RasDialDlgA(
    LPSTR lpszPhonebook,   // optional
    LPSTR lpszEntry,   // optional
    LPSTR lpszPhoneNumber,   // optional
    RASDIALDLG* lpInfo
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("RASDLG.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
static extern bool RasDialDlgA(
    [MarshalAs(UnmanagedType.LPStr)] string lpszPhonebook,   // LPSTR optional
    [MarshalAs(UnmanagedType.LPStr)] string lpszEntry,   // LPSTR optional
    [MarshalAs(UnmanagedType.LPStr)] string lpszPhoneNumber,   // LPSTR optional
    IntPtr lpInfo   // RASDIALDLG* in/out
);
<DllImport("RASDLG.dll", CharSet:=CharSet.Ansi, ExactSpelling:=True)>
Public Shared Function RasDialDlgA(
    <MarshalAs(UnmanagedType.LPStr)> lpszPhonebook As String,   ' LPSTR optional
    <MarshalAs(UnmanagedType.LPStr)> lpszEntry As String,   ' LPSTR optional
    <MarshalAs(UnmanagedType.LPStr)> lpszPhoneNumber As String,   ' LPSTR optional
    lpInfo As IntPtr   ' RASDIALDLG* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' lpszPhonebook : LPSTR optional
' lpszEntry : LPSTR optional
' lpszPhoneNumber : LPSTR optional
' lpInfo : RASDIALDLG* in/out
Declare PtrSafe Function RasDialDlgA Lib "rasdlg" ( _
    ByVal lpszPhonebook As String, _
    ByVal lpszEntry As String, _
    ByVal lpszPhoneNumber As String, _
    ByVal lpInfo As LongPtr) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

RasDialDlgA = ctypes.windll.rasdlg.RasDialDlgA
RasDialDlgA.restype = wintypes.BOOL
RasDialDlgA.argtypes = [
    wintypes.LPCSTR,  # lpszPhonebook : LPSTR optional
    wintypes.LPCSTR,  # lpszEntry : LPSTR optional
    wintypes.LPCSTR,  # lpszPhoneNumber : LPSTR optional
    ctypes.c_void_p,  # lpInfo : RASDIALDLG* in/out
]
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('RASDLG.dll')
RasDialDlgA = Fiddle::Function.new(
  lib['RasDialDlgA'],
  [
    Fiddle::TYPE_VOIDP,  # lpszPhonebook : LPSTR optional
    Fiddle::TYPE_VOIDP,  # lpszEntry : LPSTR optional
    Fiddle::TYPE_VOIDP,  # lpszPhoneNumber : LPSTR optional
    Fiddle::TYPE_VOIDP,  # lpInfo : RASDIALDLG* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "rasdlg")]
extern "system" {
    fn RasDialDlgA(
        lpszPhonebook: *mut u8,  // LPSTR optional
        lpszEntry: *mut u8,  // LPSTR optional
        lpszPhoneNumber: *mut u8,  // LPSTR optional
        lpInfo: *mut RASDIALDLG  // RASDIALDLG* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("RASDLG.dll", CharSet = CharSet.Ansi)]
public static extern bool RasDialDlgA([MarshalAs(UnmanagedType.LPStr)] string lpszPhonebook, [MarshalAs(UnmanagedType.LPStr)] string lpszEntry, [MarshalAs(UnmanagedType.LPStr)] string lpszPhoneNumber, IntPtr lpInfo);
"@
$api = Add-Type -MemberDefinition $sig -Name 'RASDLG_RasDialDlgA' -Namespace Win32 -PassThru
# $api::RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
#uselib "RASDLG.dll"
#func global RasDialDlgA "RasDialDlgA" sptr, sptr, sptr, sptr
; RasDialDlgA lpszPhonebook, lpszEntry, lpszPhoneNumber, varptr(lpInfo)   ; 戻り値は stat
; lpszPhonebook : LPSTR optional -> "sptr"
; lpszEntry : LPSTR optional -> "sptr"
; lpszPhoneNumber : LPSTR optional -> "sptr"
; lpInfo : RASDIALDLG* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "RASDLG.dll"
#cfunc global RasDialDlgA "RasDialDlgA" str, str, str, var
; res = RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
; lpszPhonebook : LPSTR optional -> "str"
; lpszEntry : LPSTR optional -> "str"
; lpszPhoneNumber : LPSTR optional -> "str"
; lpInfo : RASDIALDLG* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL RasDialDlgA(LPSTR lpszPhonebook, LPSTR lpszEntry, LPSTR lpszPhoneNumber, RASDIALDLG* lpInfo)
#uselib "RASDLG.dll"
#cfunc global RasDialDlgA "RasDialDlgA" str, str, str, var
; res = RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
; lpszPhonebook : LPSTR optional -> "str"
; lpszEntry : LPSTR optional -> "str"
; lpszPhoneNumber : LPSTR optional -> "str"
; lpInfo : RASDIALDLG* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	rasdlg = windows.NewLazySystemDLL("RASDLG.dll")
	procRasDialDlgA = rasdlg.NewProc("RasDialDlgA")
)

// lpszPhonebook (LPSTR optional), lpszEntry (LPSTR optional), lpszPhoneNumber (LPSTR optional), lpInfo (RASDIALDLG* in/out)
r1, _, err := procRasDialDlgA.Call(
	uintptr(unsafe.Pointer(windows.BytePtrFromString(lpszPhonebook))),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(lpszEntry))),
	uintptr(unsafe.Pointer(windows.BytePtrFromString(lpszPhoneNumber))),
	uintptr(lpInfo),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function RasDialDlgA(
  lpszPhonebook: PAnsiChar;   // LPSTR optional
  lpszEntry: PAnsiChar;   // LPSTR optional
  lpszPhoneNumber: PAnsiChar;   // LPSTR optional
  lpInfo: Pointer   // RASDIALDLG* in/out
): BOOL; stdcall;
  external 'RASDLG.dll' name 'RasDialDlgA';
result := DllCall("RASDLG\RasDialDlgA"
    , "AStr", lpszPhonebook   ; LPSTR optional
    , "AStr", lpszEntry   ; LPSTR optional
    , "AStr", lpszPhoneNumber   ; LPSTR optional
    , "Ptr", lpInfo   ; RASDIALDLG* in/out
    , "Int")   ; return: BOOL
●RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo) = DLL("RASDLG.dll", "bool RasDialDlgA(char*, char*, char*, void*)")
# 呼び出し: RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
# lpszPhonebook : LPSTR optional -> "char*"
# lpszEntry : LPSTR optional -> "char*"
# lpszPhoneNumber : LPSTR optional -> "char*"
# lpInfo : RASDIALDLG* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "rasdlg" fn RasDialDlgA(
    lpszPhonebook: [*c]const u8, // LPSTR optional
    lpszEntry: [*c]const u8, // LPSTR optional
    lpszPhoneNumber: [*c]const u8, // LPSTR optional
    lpInfo: [*c]RASDIALDLG // RASDIALDLG* in/out
) callconv(std.os.windows.WINAPI) i32;
proc RasDialDlgA(
    lpszPhonebook: cstring,  # LPSTR optional
    lpszEntry: cstring,  # LPSTR optional
    lpszPhoneNumber: cstring,  # LPSTR optional
    lpInfo: ptr RASDIALDLG  # RASDIALDLG* in/out
): int32 {.importc: "RasDialDlgA", stdcall, dynlib: "RASDLG.dll".}
pragma(lib, "rasdlg");
extern(Windows)
int RasDialDlgA(
    const(char)* lpszPhonebook,   // LPSTR optional
    const(char)* lpszEntry,   // LPSTR optional
    const(char)* lpszPhoneNumber,   // LPSTR optional
    RASDIALDLG* lpInfo   // RASDIALDLG* in/out
);
ccall((:RasDialDlgA, "RASDLG.dll"), stdcall, Int32,
      (Cstring, Cstring, Cstring, Ptr{RASDIALDLG}),
      lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
# lpszPhonebook : LPSTR optional -> Cstring
# lpszEntry : LPSTR optional -> Cstring
# lpszPhoneNumber : LPSTR optional -> Cstring
# lpInfo : RASDIALDLG* in/out -> Ptr{RASDIALDLG}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t RasDialDlgA(
    const char* lpszPhonebook,
    const char* lpszEntry,
    const char* lpszPhoneNumber,
    void* lpInfo);
]]
local rasdlg = ffi.load("rasdlg")
-- rasdlg.RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
-- lpszPhonebook : LPSTR optional
-- lpszEntry : LPSTR optional
-- lpszPhoneNumber : LPSTR optional
-- lpInfo : RASDIALDLG* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('RASDLG.dll');
const RasDialDlgA = lib.func('__stdcall', 'RasDialDlgA', 'int32_t', ['str', 'str', 'str', 'void *']);
// RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
// lpszPhonebook : LPSTR optional -> 'str'
// lpszEntry : LPSTR optional -> 'str'
// lpszPhoneNumber : LPSTR optional -> 'str'
// lpInfo : RASDIALDLG* in/out -> 'void *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("RASDLG.dll", {
  RasDialDlgA: { parameters: ["buffer", "buffer", "buffer", "pointer"], result: "i32" },
});
// lib.symbols.RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo)
// lpszPhonebook : LPSTR optional -> "buffer"
// lpszEntry : LPSTR optional -> "buffer"
// lpszPhoneNumber : LPSTR optional -> "buffer"
// lpInfo : RASDIALDLG* in/out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t RasDialDlgA(
    const char* lpszPhonebook,
    const char* lpszEntry,
    const char* lpszPhoneNumber,
    void* lpInfo);
C, "RASDLG.dll");
// $ffi->RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, lpInfo);
// lpszPhonebook : LPSTR optional
// lpszEntry : LPSTR optional
// lpszPhoneNumber : LPSTR optional
// lpInfo : RASDIALDLG* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Rasdlg extends StdCallLibrary {
    Rasdlg INSTANCE = Native.load("rasdlg", Rasdlg.class, W32APIOptions.ASCII_OPTIONS);
    boolean RasDialDlgA(
        String lpszPhonebook,   // LPSTR optional
        String lpszEntry,   // LPSTR optional
        String lpszPhoneNumber,   // LPSTR optional
        Pointer lpInfo   // RASDIALDLG* in/out
    );
}
@[Link("rasdlg")]
lib LibRASDLG
  fun RasDialDlgA = RasDialDlgA(
    lpszPhonebook : UInt8*,   # LPSTR optional
    lpszEntry : UInt8*,   # LPSTR optional
    lpszPhoneNumber : UInt8*,   # LPSTR optional
    lpInfo : RASDIALDLG*   # RASDIALDLG* in/out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef RasDialDlgANative = Int32 Function(Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Pointer<Void>);
typedef RasDialDlgADart = int Function(Pointer<Utf8>, Pointer<Utf8>, Pointer<Utf8>, Pointer<Void>);
final RasDialDlgA = DynamicLibrary.open('RASDLG.dll')
    .lookupFunction<RasDialDlgANative, RasDialDlgADart>('RasDialDlgA');
// lpszPhonebook : LPSTR optional -> Pointer<Utf8>
// lpszEntry : LPSTR optional -> Pointer<Utf8>
// lpszPhoneNumber : LPSTR optional -> Pointer<Utf8>
// lpInfo : RASDIALDLG* in/out -> Pointer<Void>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function RasDialDlgA(
  lpszPhonebook: PAnsiChar;   // LPSTR optional
  lpszEntry: PAnsiChar;   // LPSTR optional
  lpszPhoneNumber: PAnsiChar;   // LPSTR optional
  lpInfo: Pointer   // RASDIALDLG* in/out
): BOOL; stdcall;
  external 'RASDLG.dll' name 'RasDialDlgA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "RasDialDlgA"
  c_RasDialDlgA :: CString -> CString -> CString -> Ptr () -> IO CInt
-- lpszPhonebook : LPSTR optional -> CString
-- lpszEntry : LPSTR optional -> CString
-- lpszPhoneNumber : LPSTR optional -> CString
-- lpInfo : RASDIALDLG* in/out -> Ptr ()
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let rasdialdlga =
  foreign "RasDialDlgA"
    (string @-> string @-> string @-> (ptr void) @-> returning int32_t)
(* lpszPhonebook : LPSTR optional -> string *)
(* lpszEntry : LPSTR optional -> string *)
(* lpszPhoneNumber : LPSTR optional -> string *)
(* lpInfo : RASDIALDLG* in/out -> (ptr void) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library rasdlg (t "RASDLG.dll"))
(cffi:use-foreign-library rasdlg)

(cffi:defcfun ("RasDialDlgA" ras-dial-dlg-a :convention :stdcall) :int32
  (lpsz-phonebook :string)   ; LPSTR optional
  (lpsz-entry :string)   ; LPSTR optional
  (lpsz-phone-number :string)   ; LPSTR optional
  (lp-info :pointer))   ; RASDIALDLG* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $RasDialDlgA = Win32::API::More->new('RASDLG',
    'BOOL RasDialDlgA(LPCSTR lpszPhonebook, LPCSTR lpszEntry, LPCSTR lpszPhoneNumber, LPVOID lpInfo)');
# my $ret = $RasDialDlgA->Call($lpszPhonebook, $lpszEntry, $lpszPhoneNumber, $lpInfo);
# lpszPhonebook : LPSTR optional -> LPCSTR
# lpszEntry : LPSTR optional -> LPCSTR
# lpszPhoneNumber : LPSTR optional -> LPCSTR
# lpInfo : RASDIALDLG* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

文字セット違い
公式の関連項目
使用する型