|
zoro 님이 쓰신 글 :
: 밑에 소스는 김영대님의 홈에서 갖고온거구요..
:
: // 이 기능을 사용하려면 IE4.0 이상에서 사용하는 wininet.dll 의 함수의
: // prototype 중 빠진 부분을 Source\RTL\Win 에 있는 wininet.pas 에 추가해야 합니다
: // wininet.pas 을 컴파일하여 wininet.dcu 를 Lib 디렉토리에 놓으세요
: // 아래 내용을 단계별로 작업하세요
:
: [1]. wininet.pas의 interface 에 아래 부분을 추가하세요
:
: {dwFlag for InternetAutodial}
: const
: INTERNET_AUTODIAL_FORCE_ONLINE = 1; //Forces an online Internet connection.
: INTERNET_AUTODIAL_FORCE_UNATTENDED = 2; //Forces an unattended Internet dial-up.
: INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 4;
:
: {dwFlags for InternetDial}
: const
: INTERNET_DIAL_UNATTENDED = $8000; //Connects to the Internet through a modem, without displaying a user interface.
:
: {dwFlags for InternetGetConnectedState}
: const
: INTERNET_CONNECTION_MODEM = 1; // Local system uses a modem to connect to the Internet.
: INTERNET_CONNECTION_LAN = 2; // Local system uses a local area network to connect to the Internet.
: INTERNET_CONNECTION_PROXY = 4; // Local system uses a proxy server to connect to the Internet.
: INTERNET_CONNECTION_MODEM_BUSY = 8; // Local system's modem is busy with a non-Internet connection.
:
: {dwState for InternetSetDialState}
: const
: INTERNET_DIALSTATE_DISCONNECTED = 1;
:
: function InternetAutodial(dwFlags : DWORD; dwReserved : DWORD) : boolean; stdcall;
: function InternetAutodialHangup(dwReserved : DWORD) : boolean; stdcall;
: function InternetDial(hwndParent : HWND; lpszConnectionId : PChar; dwFlags : DWORD;
: lpdwConnection : Pointer; dwReserved : DWORD) : DWORD; stdcall;
: function InternetGetConnectedState(lpdwFlags : Pointer; dwReserved : DWORD) : boolean; stdcall;
: function InternetGoOnline(lpszUrl : PChar; hwndParent : HWND; dwReserved : DWORD) : boolean; stdcall;
: function InternetSetDialState(lpszConnectionID : PChar; dwState : DWORD; dwReserved : DWORD) : boolean; stdcall;
:
:
: [2] implementation 에 아래 부분을 추가하세요
:
: function InternetAutodial; external winetdll name 'InternetAutodial';
: function InternetAutodialHangup; external winetdll name 'InternetAutodialHangup';
: function InternetDial; external winetdll name 'InternetDial';
: function InternetGetConnectedState; external winetdll name 'InternetGetConnectedState';
: function InternetGoOnline; external winetdll name 'InternetGoOnline';
: function InternetSetDialState; external winetdll name 'InternetSetDialState';
:
:
: [3] 아래 예제를 컴파일해서 실행하세요
:
: unit Unit1;
:
: interface
:
: uses
: Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
: StdCtrls, WinInet;
:
: type
: TForm1 = class(TForm)
: Button1: TButton;
: procedure Button1Click(Sender: TObject);
: private
: { Private declarations }
: public
: { Public declarations }
: end;
:
: var
: Form1: TForm1;
:
: implementation
: {$R *.DFM}
:
: procedure TForm1.Button1Click(Sender: TObject);
: var
: dwConnectionTypes: DWORD;
: begin
: if InternetGetConnectedState(@dwConnectionTypes, 0) then // 정상적으로 검사됨
: begin
: if (dwConnectionTypes and INTERNET_CONNECTION_MODEM) <> 0 then
: ShowMessage('Modem으로 인터넷 사용중...');
: if (dwConnectionTypes and INTERNET_CONNECTION_LAN) <> 0 then
: ShowMessage('LAN으로 인터넷 사용중...');
: if (dwConnectionTypes and INTERNET_CONNECTION_PROXY) <> 0 then
: ShowMessage('Proxy로 인터넷 사용중...');
: if (dwConnectionTypes and INTERNET_CONNECTION_MODEM_BUSY) <> 0 then
: ShowMessage('Modem을 다른 용도로 사용중');
: end
: else
: begin
: ShowMessage('검사할 수 없습니다');
: end;
: end;
:
: end.
:
:
: 이걸 씨빌더에서 쓰려고 하는데 잘안되는군요..
: 빌더에 내장된 wininet.pas를 살펴보았는데 고칠게 없는거 같아요..
: 그래서 c로 컴버트해서 컴파일 하니까 자꾸
: linker error가 나는군요.. 그래서 잘돌아가는 delphi5 wininet.pas를
: 갖다쓰려니까(아예 프로젝트에 포함시켜서..) 그것도 안되고...
: 어찌하오리까..
:
: 다들 마지막 말은 이렇게 쓰더군요..
: 즐거운 하루 되세요...
:
: 글구요..하나 임프님께 부탁드릴께요..
: 방대한 자료가 있슴에도 여기서 자료 찾기란 대단히
: 힘들어요.. 제가 search를 잘못해서 그런가요?
: 어쨌든 강력한 search와 section별로 구분이 됬슴해요..
:
: 빌더애용자 조로 드림~~
:
:
임펠리테리입니다.
원래 소스를 작성한 시점이 델파이4가 나오기 이전이었나보네요. 델파이4(빌더4, 5를 포함해서)이후에는 vcl에 새로운 버전의 wininet.pas가 포함되었는데, 이 새로운 버전에는 위에서 임의로 추가해준 InternetGetConnectedState() 등의 새로운 함수들이 추가되어 있으므로 위에서 말한 것처럼 새로운 함수들을 추가하려고 신경쓰시지 않아도 됩니다.
사실 빌더에서는 위와 같은 wininet.pas 소스가 아니라, wininet.h 파일과 wininet.lib 파일이 중요합니다. InternetGetConnectedState() 과 같은 함수들은 원래 wininet.dll에 있는 함수를 임포트한 것 뿐인데, 델파이에서 사용하는 파스칼에서야 wininet.pas를 변경해야 하지만, 빌더에서는 .hpp와 .lib 파일에서 선언하고 임포트하니까요.
링커 에러가 난 것은 단순히 wininet.lib 파일이 링크되지 않아서입니다. 디폴트로 링크되는 모듈이 아닌 관계로, 이 wininet.lib 파일을 명시적으로 링크해주지 않으면 InternetGetConnectedState() 함수의 임포트한 곳을 찾을 수 없으므로(결과적으로 함수의 바디가 없는 셈이죠) 링커에러가 납니다.
이 문제를 해결하려면 단순히 InternetGetConnectedState() 함수를 사용한 .cpp 소스의 상단에 다음 한줄을 추가해주면 됩니다.
#pragma link "wininet.lib"
한편... Wininet api는 원래 처음 win32가 공개되었을 때 포함되었던 게 아니라 새로이 추가된 함수군인 관계로(그래서 win95에는 wininet.dll이 없습니다) InternetGetConnectedState() 함수는 현재에 이르러서는 새로운 기능들이 더 추가되어 있는데, 델파이5와 빌더5에는 이러한 새로운 부분들이 다 반영되어 있습니다. 그래서 원래 보여주셨던 소스는 다음과 같이 조금 더 확장될 수 있죠.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD dwConnectionTypes;
if(InternetGetConnectedState(&dwConnectionTypes, 0)) // 정상적으로 검사됨
{
if((dwConnectionTypes & INTERNET_CONNECTION_MODEM) != 0)
ShowMessage("Modem으로 인터넷 사용중...");
if((dwConnectionTypes & INTERNET_CONNECTION_LAN) != 0)
ShowMessage("LAN으로 인터넷 사용중...");
if((dwConnectionTypes & INTERNET_CONNECTION_PROXY) != 0)
ShowMessage("Proxy로 인터넷 사용중...");
if((dwConnectionTypes & INTERNET_CONNECTION_MODEM_BUSY) != 0)
ShowMessage("Modem을 다른 용도로 사용중");
if((dwConnectionTypes & INTERNET_RAS_INSTALLED) != 0)
ShowMessage("RAS가 설치되어 있음");
if((dwConnectionTypes & INTERNET_CONNECTION_OFFLINE) != 0)
ShowMessage("오프라인");
if((dwConnectionTypes & INTERNET_CONNECTION_CONFIGURED) != 0)
ShowMessage("인터넷 연결이 설정되었음");
}
else
ShowMessage("검사할 수 없습니다");
}
이 InternetGetConnectedState() 함수의 새 버전이라고 할 수 있는 InternetGetConnectedStateEx() 함수도 있는데, 이 함수에서 추가된 기능은 현재의 연결 이름을 리턴하는 기능입니다. 예를 들어, 랜을 통해 인터넷으로 연결되어 있다면 "랜 연결"이라는 문자열이 나오죠.
그럼 참고하시길...
|