RasDialDlgA
関数シグネチャ
// RASDLG.dll (ANSI / -A)
#include <windows.h>
BOOL RasDialDlgA(
LPSTR lpszPhonebook, // optional
LPSTR lpszEntry, // optional
LPSTR lpszPhoneNumber, // optional
RASDIALDLG* lpInfo
);パラメーター
| 名前 | 型 | 方向 | 説明 |
|---|---|---|---|
| lpszPhonebook | LPSTR | inoptional | 電話帳 (PBK) ファイルのフル パスとファイル名を指定する、null で終わる文字列へのポインター。このパラメーターが NULL の場合、関数は現在の既定の電話帳ファイルを使用します。既定の電話帳ファイルは、ダイヤルアップ ネットワーク ダイアログ ボックスの ユーザー設定 プロパティ シートでユーザーが選択したものです。 |
| lpszEntry | LPSTR | inoptional | ダイヤルする電話帳エントリの名前を指定する、null で終わる文字列へのポインター。 |
| lpszPhoneNumber | LPSTR | inoptional | 電話帳エントリに格納されている番号を上書きする電話番号を指定する、null で終わる文字列へのポインター。このパラメーターが NULL の場合、 RasDialDlg は電話帳エントリ内の番号を使用します。 |
| lpInfo | RASDIALDLG* | 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 で指定された既定の電話帳内のエントリにダイヤルします。
#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 公式リファレンス: 英語 (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 方式にも切替可。#uselib "RASDLG.dll" #cfunc global RasDialDlgA "RasDialDlgA" str, str, str, sptr ; res = RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, varptr(lpInfo)) ; lpszPhonebook : LPSTR optional -> "str" ; lpszEntry : LPSTR optional -> "str" ; lpszPhoneNumber : LPSTR optional -> "str" ; lpInfo : RASDIALDLG* in/out -> "sptr" ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは 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 方式にも切替可。; BOOL RasDialDlgA(LPSTR lpszPhonebook, LPSTR lpszEntry, LPSTR lpszPhoneNumber, RASDIALDLG* lpInfo) #uselib "RASDLG.dll" #cfunc global RasDialDlgA "RasDialDlgA" str, str, str, intptr ; res = RasDialDlgA(lpszPhonebook, lpszEntry, lpszPhoneNumber, varptr(lpInfo)) ; lpszPhonebook : LPSTR optional -> "str" ; lpszEntry : LPSTR optional -> "str" ; lpszPhoneNumber : LPSTR optional -> "str" ; lpInfo : RASDIALDLG* in/out -> "intptr" ; ※出力/バッファ引数はポインタ方式(token=intptr / 呼び出しは 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 // BOOLfunction 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 を使用。関連項目
- f RasDialDlgW (Unicode版) — RAS接続のダイヤルダイアログを表示し接続を行う(Unicode版)。
- f RasPhonebookDlgA — RAS電話帳メインダイアログを表示する(ANSI版)。