부산의 월천 박영목 입니다.
현재 델파이에서 작업하고 있습니다. 잘 다루지도 못하는데... 그래서 이것 델파이 코드
입니다... C++빌더로 바꾸어 주십사 하고 이곳에 올립니다.... ㅋㅋㅋㅋ
그렇게 코드양이 많지 않고 델파이의 막강한 부분의 기능이 필요해서.... ㅋㅋㅋ
네트워크 연결하기 / 연결끊기 할 일이 생겼다....
이 방법을 알아내기 위해 오늘 하루 거의 다 보내 버리고 말았습니다. 될 듯하면서 안되고...
지금 델파이로 작업 중이라... 델파이 소스 를 구했습니다... C++도 쉽게 되겠지요...
누구 바꾸어 주시길... 지금 무지 바빠서..... ㅋㅋㅋ
방법은 3가지 정도 있다고 되어 있는데.... 정성이 부족하여서 그런지 잘 되지 않음...
-----------------------------------------------------------------------------------------
아래는 아마 devpia에서 찾은 것 같은데.... 참고하시고....
[답변]NIC Enable / Disable 제어하기 2008-03-26 오전 11:51:07
고지범 (엘케인) 번호: 714764 / 평점: (-)
비슷한 경우를 찾아봐서 도움이 될까 하고 적습니다.
아래 내용은 .NET 관련해서 질답에 올린 사항인데, C++에도 유효할 듯합니다.
SetIfEntry() 사용하는 방식은 별로라고 하는 사람들이 많아서 제외했습니다.
Network Connection Enable / Disable 제어 관련 내용입니다.
인터넷을 구글해보니, 아래의 3가지 경우로 압축이 됩니다.
Win32_NetworkAdapter Disable Class
1. WMI 기능 사용
- WMI 에서 Win32_NetworkAdapter Class를 사용하는 방법입니다.
해당 클래스에 Enable / Disable 멤버 함수가 존재합니다.
장점 : WMI, C++ 사용 가능
단점 : C++로 해도 구현 코드가 길고, C# 으로 사용하기 어려움. (사용방법이 떠오르지 않네요.)
참조 :
http://msdn2.microsoft.com/en-us/library/aa394216(VS.85).aspx
2. INetConnectionManager 인터페이스 사용
- Platform SDK에 있는 NetCon.h에 정의되어 있는 인터페이스를 사용해서 제어를 합니다.
해당 인터페이스를 이용해서 INetConnection 인터페이스를 구합니다.
INetConnection 인터페이스에 connect / disconnect 멤버 함수가 존재합니다.
장점 : C++ 사용 가능, 1번 항목보다 직관적이며 코딩량이 적음.
단점 : unmanaged C++에서만 사용가능. 심지어 managed C++에서조차 사용할 수 없음.
참조 :
http://www.codeguru.com/forum/showthread.php?t=419909 작성자 ess1_il
3. Shell Automation 이용
- Microsoft Shell and Automation을 참조하여 오토메이션 기능 사용
사용자가 "내 컴퓨터">"제어판">"네트워크 폴더" 로 이동하여 제어하고자 하는 네트워크 커넥션,
가령 이름이 "로컬 영역 연결" 인 네트워크 커넥션을 선택해서 오른쪽 마우스 클릭하여 컨텍스트 메뉴 중에서
"사용" / "사용 안 함"을 선택하는 과정을 자동화시켜 해당 기능을 구현함.
장점 : .NET 사용 가능. XP에서 테스트 완료함. 예제가 필요하시면 연락을...
단점 : 실행 환경이 어드민 권한을 요구함.
Vista 에서 테스트 해보지 않았으나 안될 가능성 90%
Windows XP 한글판 / 영어판 / 기타 언어판 에서 네트워크 폴더 명 및 사용 verb 다름.
가령 한글판 : "네트워크 연결" / "사용(&A) / "사용 안 함(&B",
영어판 : "Network Connections" / "En&able" / "Disa&ble" 문자열을 사용해야 함.
C++로 구현 시 Shell Automation 관련 코딩량이 길어짐.
참조 :
http://vbcity.com/forums/topic.asp?tid=56821 작성자 drydo
C++ 로 구현하는 경우, 위의 2번 항목을 추천합니다.
다만, Shell Automation 쪽 해보셨으면, 3번이 더 메리트가 있을 것 같습니다.
3번이 직관적이고도 안정적으로 구현되기 때문입니다.
도움이 되길 바라며...~
----------------------------------------------------------------------------------
출처 :
http://www.autoitscript.com/forum/lofiversion/index.php?t72165.html 이곳에 가면
비스타 용도 있던데.... 한번 가보세요...
네트워크 연결하기 / 연결끊기 쉘방식 입니다. 이 방법이 제일 안전 하지요 물론 프로그램적으로..
이것을 가지고 하니 Error가 나더군요.... 물론 또 나는 분도 있을 것입니다. 항목명 때문에 나는 것이데
자신의 맞게 수정해 주시면 됩니다. 그냥 윈도우 설치하고 장난을 한번도 치지 않았다면 그대로 사용하면
동작할 것입니다. 아래 것은 영문 윈도우에서는 Error 발생하지 않을 것입니다.
한글 윈도우 기본으로 설치했을 때 항목명을 수정했습니다. 동작해 보고 Error가 발생하면 자신의
네트워크 연결 항목들을 점검해 보시기 바랍니다.
; Windows XP (BORLAND DELPHI)
; ==================================
; here you need to add 'Microsoft Shell Controls and Automation' go
; to Project|Import Type Library, uncheck 'Generate Component Wrapper',
; Mselect 'Microsoft Shell Controls and Automation', and click Create
; Unit; then, add Shell32_tlb to your unit's uses clause.
function ToggleLAN(const ConnectionName: string): Boolean;
const
EnableVerb = 'En&able';
DisableVerb = 'Disa&ble';
LANEnable: Boolean = True;
var
ShellApp: Shell32_tlb.Shell;
ControlPanel: Shell32_tlb.Folder;
FolderItem: Shell32_tlb.FolderItem;
NetworkFolder: Shell32_tlb.Folder;
LANConnection: Shell32_tlb.FolderItem;
EnableVerbItem, DisableVerbItem, Verb : Shell32_tlb.FolderItemVerb;
I,K: Integer;
begin
Result := False;
ShellApp := CoShell.Create;
ControlPanel := ShellApp.NameSpace(ssfCONTROLS);
// test := ConnectionName;
for I := 0 to ControlPanel.Items.Count - 1 do
begin
FolderItem := ControlPanel.Items.Item(I);
// ShowMessage(FolderItem.Name);
if (FolderItem.Name = 'Network Connections') or
(FolderItem.Name = 'Network and Dial-up Connections') or
(FolderItem.Name = 'Network and Sharing Center') then
begin
NetworkFolder := FolderItem.GetFolder as Folder;
Break;
end;
end;
if NetworkFolder = nil then
begin
Result := False;
Exit;
end;
for I := 0 to NetworkFolder.Items.Count - 1 do
begin
FolderItem := NetworkFolder.Items.Item(I);
// ShowMessage(FolderItem.Name);
if FolderItem.Name = ConnectionName then
begin
LANConnection := FolderItem;
Break;
end;
end;
if LANConnection = nil then
begin
Result := False;
Exit;
end;
for I := 0 to LANConnection.Verbs.Count - 1 do
begin
if LANConnection.Verbs.Item(I).Name = EnableVerb then
begin
EnableVerbItem := LANConnection.Verbs.Item(I);
LANEnable := True;
Break;
end
else if LANConnection.Verbs.Item(I).Name = DisableVerb then
begin
DisableVerbItem := LANConnection.Verbs.Item(I);
LANEnable := False;
Break;
end;
end;
if LANEnable then
EnableVerbItem.DoIt
else
DisableVerbItem.DoIt;
Result := True;
end;
--------------------------------------------------------------------------------
끊기 > netsh interface set interface "로컬 영역 연결" disabled
연결 > netsh interface set interface "로컬 영역 연결" enabled
근데 이게 os에 따라 되는데가 있고 안되는데가 있더군요
참조하세요