C++ 写了一个取本机MAC地址的DLL方法 然后用C++又写了一个OCX调用这个dll中的取MAC的方法用于页面调用 但是页面调用时报错 高手进来看看!

撒哈拉_小猴 2016-03-21 12:59:38
DLL 中的方法:

// smzfGetMac.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"
#include<atlbase.h>
#include<atlconv.h>
#include <Iphlpapi.h>
#pragma comment (lib,"Iphlpapi.lib")
using namespace std;

// 这是导出函数的一个示例。
char mac[100], * lpmac;
void getMac(){
printf("进入DLL方法\n");
PIP_ADAPTER_INFO pAdapterInfo;
PIP_ADAPTER_INFO pAdapter=NULL;
DWORD dwRetVal=0;
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));

ULONG ulOutBufLen=sizeof(IP_ADAPTER_INFO);
if(GetAdaptersInfo(pAdapterInfo,&ulOutBufLen)!=ERROR_SUCCESS)
{
GlobalFree(pAdapterInfo);
pAdapterInfo=(IP_ADAPTER_INFO*)malloc(ulOutBufLen);
}
GetAdaptersInfo(pAdapterInfo,&ulOutBufLen);
pAdapter=pAdapterInfo;
bool _IsConnect=false;
while(pAdapter)
{
if(strstr(pAdapter->Description,"VMware")<=0){
MIB_IFROW Info ;
memset(&Info ,0 ,sizeof(MIB_IFROW)) ;
Info.dwIndex=pAdapter->Index;
if(GetIfEntry(&Info) != NO_ERROR){
}
switch(Info.dwOperStatus)
{
case IF_OPER_STATUS_NON_OPERATIONAL :
break;
case IF_OPER_STATUS_OPERATIONAL:
sprintf_s(mac,"%02X-%02X-%02X-%02X-%02X-%02X",
pAdapter->Address[0],
pAdapter->Address[1],
pAdapter->Address[2],
pAdapter->Address[3],
pAdapter->Address[4],
pAdapter->Address[5]);
lpmac=mac;
break;
default:
break;
}
}
pAdapter=pAdapter->Next;
}
free(pAdapterInfo);
free(pAdapter);

}

extern "C" __declspec(dllexport) char * __getMac()
{
getMac();
return lpmac;
}





这是OCX中调用时的方法

BSTR CgetMacOCXCtrl::Get_MacAddress(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString strResult;
typedef char* (*Dllfun)();
Dllfun __getMac;
HINSTANCE hdll;
hdll=LoadLibrary("smzfGetMac.dll");
if(hdll==NULL)
{
FreeLibrary(hdll);
}
__getMac=(Dllfun)GetProcAddress(hdll,"__getMac");
if(__getMac==NULL)
{
FreeLibrary(hdll);
}
char * lpmac;
lpmac=(char * )__getMac();
FreeLibrary(hdll);
strResult=lpmac;
// TODO: 在此添加调度处理程序代码
return strResult.AllocSysString();
}







奇怪的是 我又用另一个窗口命令程序调用完全可以调用成功

// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "afxdialogex.h"

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{


typedef char* (*Dllfun)();
Dllfun __getMac;
HINSTANCE hdll;
hdll=LoadLibrary("smzfGetMac.dll");
if(hdll==NULL)
{
FreeLibrary(hdll);
}
__getMac=(Dllfun)GetProcAddress(hdll,"__getMac");
if(__getMac==NULL)
{
FreeLibrary(hdll);
}
CString strResult;
char * lpmac;
lpmac=(char *)__getMac();
printf("%s\n",lpmac);

strResult=lpmac;
FreeLibrary(hdll);

printf("%s",strResult);

getchar();
return 0;
}





请问是我ocx中调用的又问题吗??? 我是做.net的对C++不是很了解,求达人解答 详细点谢谢了!
...全文
155 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
撒哈拉_小猴 2016-03-21
  • 打赏
  • 举报
回复

BSTR CgetMacOCXCtrl::Get_MacAddress(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	
	typedef char* (*Dllfun)();
	Dllfun __getMac;
	HINSTANCE hdll;
	hdll=LoadLibrary("smzfGetMac.dll");
	if(hdll==NULL)
	{
		FreeLibrary(hdll);
	}
	__getMac=(Dllfun)GetProcAddress(hdll,"__getMac");
	
	if(__getMac==NULL)
	{
		FreeLibrary(hdll);
	} 
	char *   lpmac=new char[100];
	memset(lpmac,0,100*sizeof(char));
	lpmac=(char * )__getMac();
	
	CString strResult;
	strResult=lpmac;
	//AfxMessageBox(strResult);
	// TODO: 在此添加调度处理程序代码
	FreeLibrary(hdll);
	return strResult.AllocSysString();
}
搞定了!谢谢楼上的!
撒哈拉_小猴 2016-03-21
  • 打赏
  • 举报
回复
引用 3 楼 Lxy_Terry 的回复:
调试的时候出现这个
这个貌似不是真正的原因
撒哈拉_小猴 2016-03-21
  • 打赏
  • 举报
回复



调试的时候出现这个
赵4老师 2016-03-21
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
dustpg 2016-03-21
  • 打赏
  • 举报
回复
返回char*是作死行为,特别是在dll函数中。 要么提供字符缓存做为参数让函数写,要么返回BSTR 去,然后让调用者释放

64,650

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧