修改IP地址使用未公开函数, 即用netcfgx.dll封装的dhcpcsvc.dll中DhcpNotifyConfigChange函数
不用重起,调用此函数时出现异常如下:
Run-Time Check Failure#0 - The value of ESP was not properly saved across a function call.
This is usuallly a result of calling a function declared with one calling convention with a
function pointer declared with a different calling convention.帮忙分析一下!!!
不用重起,调用此函数时出现异常如下:
Run-Time Check Failure#0 - The value of ESP was not properly saved across a function call.
This is usuallly a result of calling a function declared with one calling convention with a
function pointer declared with a different calling convention.帮忙分析一下!!!
解决方案 »
- 如何在窗口的图片静态控件上增加横和坚的滚动条?
- 如何取得整个屏幕的矩形坐标?(或者长度和宽度也行)
- 一个很简单的问题,望指导~
- 进来请看。SQL执行后可变的结果集好象不能和一般固定长度的结果集合一样。
- 想要买个移动硬盘,大家给你建议
- WTL,CCodePageCombo继承CComboBoxT<ATL::CWindow>类,需要响应下拉菜单CloseUp的消息
- 关于两个静态切分窗口view的同步更新的问题
- vc调试问题 ,关系到重装系统
- 想问一个问题,可能对我的影响比较大。希望可以听听你们的意见!
- supperlxf(嘿嘿) hackerning(勤学) 请再次进来领分!!!
- 求答案,
- XP启动黑屏!200分求解,不够再加!
http://www.vckbase.com/document/viewdoc/?id=851
同一篇文章,不过有Sample。你看看编译运行这个Sample有没有问题。然后对照代码复查下你的代码
这是我的代码:
typedef BOOL (*DHCPNOTIFYPROC ) (LPWSTR , LPWSTR, BOOL ,
DWORD , // 指明第几个IP地址,如果只有该接口只有一个IP地址则为0
DWORD , // IP地址
DWORD , // 子网掩码
int ); // 对DHCP的操作 0:不修改, 1:启用 DHCP,2:禁用 DHCP
BOOL NotifyIPChange(LPCTSTR lpszAdapterName, int nIndex, LPCTSTR pIPAddress, LPCTSTR pNetMask)
{
BOOL bResult = FALSE;
HINSTANCE hDhcpDll;
DHCPNOTIFYPROC pDhcpNotifyProc;
WCHAR wcAdapterName[256]; MultiByteToWideChar(CP_ACP, 0, lpszAdapterName, -1, wcAdapterName,256); if((hDhcpDll = LoadLibrary("dhcpcsvc")) == NULL)
return FALSE; if((pDhcpNotifyProc = (DHCPNOTIFYPROC)GetProcAddress(hDhcpDll, "DhcpNotifyConfigChange")) != NULL)
if((pDhcpNotifyProc)(NULL, wcAdapterName, TRUE, nIndex, inet_addr(pIPAddress), inet_addr(pNetMask), 0) == ERROR_SUCCESS)
bResult = TRUE; FreeLibrary(hDhcpDll);
return bResult;
}
//写注册表
BOOL RegSetIP(LPCTSTR lpszAdapterName, LPCTSTR pIPAddress, LPCTSTR pNetMask, LPCTSTR pNetGate)
{
HKEY hKey;
LPCTSTR strKeyName = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\";
char pkey[100];
strcpy(pkey,strKeyName);
strcat(pkey,lpszAdapterName);//{8A5D771D-36C6-4F3E-B161-53F3BB5377D2}
//strncat(strKeyName,lpszAdapterName,98);
//strKeyName += lpszAdapterName;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
pkey,
0,
KEY_WRITE,
&hKey) != ERROR_SUCCESS)
return FALSE;
char mszIPAddress[100];
char mszNetMask[100];
char mszNetGate[100]; strncpy(mszIPAddress, pIPAddress, 98);
strncpy(mszNetMask, pNetMask, 98);
strncpy(mszNetGate, pNetGate, 98); int nIP, nMask, nGate; nIP = strlen(mszIPAddress);
nMask = strlen(mszNetMask);
nGate = strlen(mszNetGate); *(mszIPAddress + nIP + 1) = 0x00; // REG_MULTI_SZ数据需要在后面再加个0
nIP += 2; *(mszNetMask + nMask + 1) = 0x00;
nMask += 2; *(mszNetGate + nGate + 1) = 0x00;
nGate += 2;
RegSetValueEx(hKey, "IPAddress", 0, REG_MULTI_SZ, (unsigned char*)mszIPAddress, nIP);
RegSetValueEx(hKey, "SubnetMask", 0, REG_MULTI_SZ, (unsigned char*)mszNetMask, nMask);
RegSetValueEx(hKey, "DefaultGateway", 0, REG_MULTI_SZ, (unsigned char*)mszNetGate, nGate); RegCloseKey(hKey); return TRUE;
}//MAIN
int main(int argc, char* argv[])
{
LPCTSTR adapterName;
ULONG ulAdapterInfoSize = sizeof(IP_ADAPTER_INFO);
IP_ADAPTER_INFO *pAdapterInfoBkp=NULL, *pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_BUFFER_OVERFLOW ) // 缓冲区不够大
{
delete pAdapterInfo;
pAdapterInfo = (IP_ADAPTER_INFO*)new char[ulAdapterInfoSize];
pAdapterInfoBkp = pAdapterInfo;
}
if( GetAdaptersInfo(pAdapterInfo, &ulAdapterInfoSize) == ERROR_SUCCESS )
{
do{ // 遍历所有适配器
if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET) // 判断是否为以太网接口
{
//pAdapterInfo->Description 是适配器描述
adapterName=pAdapterInfo->AdapterName;//是适配器名称
}
pAdapterInfo = pAdapterInfo->Next;
}while(pAdapterInfo);
}
delete pAdapterInfoBkp;
//写注册表
bool setFlag=false;
bool dwFlag=RegSetIP(adapterName,"192.168.1.32","255.255.255.0","192.168.1.1");
//通知IP设置更改
if(dwFlag==true)
setFlag=NotifyIPChange(adapterName,0,"192.168.1.32","255.255.255.0");
if(setFlag==true)
printf("success!"); return 0;
}