怎样调用DLL(VC++),怎样解决指针类型的变量转换问题(DLL的函数有指针变量)
我想访问客户端机器的MAC,以下代码在VC6中通过了,我向将它变成一个DLL在vb.net中使用,但是用MFC生成一个DLL后在vb中不知道怎么使用,怎么得到结果,请各位指点!!!(如果能将C程序改造成vb.net的最好)我不指知道vb.net中的ARP怎么用。
附加代码如下:
#include "stdafx.h"
#include "dlltest.h"
#include "stdio.h"
#include "stdlib.h"
#include "Winsock2.h"
#include "iphlpapi.h"
#pragma comment ( lib, "ws2_32.lib" )
#pragma comment ( lib, "Iphlpapi.lib" )
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
// CdlltestApp
BEGIN_MESSAGE_MAP(CdlltestApp, CWinApp)
END_MESSAGE_MAP()
// CdlltestApp 构造
CdlltestApp::CdlltestApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
// 唯一的一个 CdlltestApp 对象
CdlltestApp theApp;
// CdlltestApp 初始化
BOOL CdlltestApp::InitInstance()
{
CWinApp::InitInstance();
return TRUE;
}
extern "C" void PASCAL EXPORT mac(char * argv,unsigned char * mac)
{
int numberOfHost = 1;
struct hostent *remoteHostent;
//初始化SOCKET
WSADATA wsaData;
int iRet = WSAStartup(MAKEWORD(2,1), &wsaData);
if ( iRet != 0 )
{
//printf( "WSAStartup Error:%d\n", GetLastError() );
exit( 0 );
}
int nRemoteAddr = inet_addr( argv );
remoteHostent= (struct hostent*)malloc( sizeof(struct hostent ));
struct in_addr sa;
//获取远程机器名
sa.s_addr = nRemoteAddr;
//printf( "\nIpAddress : %s\n", inet_ntoa( sa ) );
remoteHostent = gethostbyaddr( (char*)&nRemoteAddr,4, AF_INET );
if ( remoteHostent )
//printf( "HostName : %s\n",remoteHostent->h_name );
;//memcpy(name,remoteHostent->h_name,sizeof(remoteHostent->h_name));
else
//printf( "gethostbyaddr Error:%d\n",GetLastError() );
;//memcpy(name,"UnKnown",7);
//发送ARP查询包获得远程MAC地址
unsigned char macAddress[6];
ULONG macAddLen = 6;
iRet = SendARP(nRemoteAddr, (unsigned long)NULL,(PULONG)&macAddress, &macAddLen);
if ( iRet == NO_ERROR )
{
memcpy(mac,macAddress,6);
}
//nRemoteAddr = htonl( ntohl( nRemoteAddr ) + 1 );
}
问题点数:20、回复次数:1Top
1 楼dhcfzc(小胖子)回复于 2003-12-05 10:26:33 得分 20
Private Declare Function inet_addr Lib "wsock32.dll" _
(ByVal s As String) As Int32
Private Declare Function SendARP Lib "iphlpapi.dll" _
(ByVal DestIP As Int32, _
ByVal SrcIP As Int32, _
ByRef pMacAddr As Byte, _
ByRef PhyAddrLen As IntPtr) As LongTop




