• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 500分求这样一个类源码。

500分求这样一个类源码。

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了电商类app源码,string类源码,java string类源码,java集合类源码,软件下载类网站源码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 500分求这样一个类源码。
描述:

实现c++下类似com下的IDispatch接口类。
特征如下
Class CDispatch
{
  CDispatch("dispatch_name");
  //通过名称注册回调函数
  reg_func("fucn_name",callback_func);
  //调用类似IDispatch的Invoke
  Invoke(("func_name",result_val,parme_num,...);
}
要求:
1,返回值可是用VARIANT类型或自己实现.
2,new出的同一dispatcvh name的实例,可以任意c++模块中调用,可以不需要跨语言
3,跨线程安全调用.
调用例子如下:
A模块中:
//全局函数func_1;
int fun_1(int i,char * c)
{
return i;
}
CDispatch a("dis");
a.reg_func("func1",fun_1);
B模块中:
CDispatch b("dis");
VARIANT v;
b.Invoke("func1",&result,2,1,"teststr");


解决方案1:

使用回调函数。有很多现成的方法。

解决方案2:

这个类的主要作用在于减少模块间的耦合关系.用于作plug-in实现大致与COM组件类似.
在任何模块中可以调用己发布的函数(即通过己注册的函数名),而不需要从别处引根指针进来调用该函数。
------------------------------------------------------------------------------------
您的意思是:
MODULE A :实现并注册了一个函数 global_func()
MODULE B : 需要调用这个global_func()
MODULE Dispatch :负责函数的注册和调用。
那MODULE B只根据注册的函数名怎样知道这个函数的返回值和参数列表呢?如果不知道的话,它的Invoke怎样call呢?这个注册的步骤是否缺少了些什么呢?

解决方案3:


#include "string"
#include "vector"
#include"map"
using namespace std;
typedef  void (* proc)(long* pRtn,...);
class MyDispatch  ;
class DispatchManager
{
vector<MyDispatch*> array;
public:
void Add(MyDispatch* p)
{
array.push_back(p);
}
MyDispatch* FindDispatch(string pName);
DispatchManager(){}
};
DispatchManager * g_pManager ;
bool InitMyLib(){ 
if( g_pManager == NULL ) 
{   g_pManager = new DispatchManager() ;
        return  1;
}
return  0;
}
void DeleteMyLib(){ 
if( g_pManager) 
delete g_pManager ;
g_pManager =  NULL; 
return ;
 } 
class MyDispatch
{
private:
string  m_cName ;
  map<string,proc> m_cFunArray;
    
 
static  string  m_cFindName;
public:
proc FindProc(string name)
{
return NULL;
}
bool IsName(string name)
{
if( m_cName  == name )
return 1;
return 0;
}
MyDispatch(string pName)
{
 m_cFindName = pName ;
 
 m_cName  = pName ;
}
void * operator new (unsigned int size)
{
MyDispatch* pRtn  = NULL;
if( pRtn = g_pManager->FindDispatch(m_cFindName)) 
{
 return pRtn ;
}
return malloc(size* sizeof( MyDispatch) ) ;
}
void RegFun(string pFunName,proc p)
{
pair<string ,proc>  par ;
par  =make_pair(pFunName,p) ;
m_cFunArray.insert(par);
}
bool Invoke(string pFunName,long* pRtn ,int i)
{
proc pc = (proc)FindProc(pFunName) ;
    pc(pRtn,i);
return 1;
}
};
MyDispatch* DispatchManager::FindDispatch(string pName)
{
vector<MyDispatch*>::iterator  pFirst ,pEnd ;
pFirst  = array.begin();
pEnd  = array.end(); 
while( pFirst != pEnd)
{
MyDispatch* p  = (MyDispatch*)*pFirst ;
if( p->IsName(pName) )
return  p ;
pFirst ++ ;
}
return 0;
}

解决方案4:

呵呵,漏了一个virtual,现在补上 :)
virtual VARIANT InvokeImpl(VARIANT* pArgs, int nArgCount)=0;
顺便问句,实现这个与模拟JNI有关吗?  :)

解决方案5:

我也有想过这个问题,如果函数fun_1的参数个数以及类型不是固定的,用这样的写法来调用CDispatch接口,这个CDispatch接口很难实现,难点在于CDispatch里面不能正确的知道函数fun_1的形态,因而不能正确的调用这个函数。
个人建议是固定函数fun_1的参数个数以及类型,如:
VARIANT fun_1(VARIANT* pArgs,int nArgCount);
还有一个方法是改变reg_func的参数,不是直接把fun_1传进去,而是把一个回调的接口传进去,这个回调的接口由实现CDispatch的人声明,而由CDispatch的使用者实现.由于这个中间接口的形态是固定的,所以CDispatch可以处理,而由于这个中间接口是由使用者实现的,所以它可以转调用任何形态的函数,完全看使用者的需要.如:
class IFuncCallBack
{
public:
    VARIANT InvokeImpl(VARIANT* pArgs, int nArgCount)=0;
};
Class CDispatch
{
public:
    bool reg_func(string sFuncName, IFuncCallBack* pFuncImpl);
};

解决方案6:

函数的参数个数以及类型是固定的?

解决方案7:

就只有用DLL才能实现吧,如用EXE那可就复杂多了.

解决方案8:

应该不算很难,但跨线程这点上我还没完全搞懂.怎样才能跨.

解决方案9:

// testcons3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <map>
#include <string>
#include "stdlib.h"
#include "stdarg.h"
#include "conio.h"
#include "comutil.h"
#pragma comment(lib, "comsupp.lib")
class CDispatch;
typedef std::map<std::string, void*> DISP_TABLE;
typedef _variant_t (*FUNCTYPE1)(_variant_t v1);
typedef _variant_t (*FUNCTYPE2)(_variant_t v1, _variant_t v2);
_variant_t func1(_variant_t i)
{
printf("func1(%d)\n", (int)i);
return _variant_t(0);
}
_variant_t func2(_variant_t i, _variant_t j)
{
printf("func2(%d,%d)\n", (int)i, (int)j);
return _variant_t(1);
}
class CDispCritical
{
private:
CRITICAL_SECTION m_Sect;
public:
CDispCritical()
{
::InitializeCriticalSection(&m_Sect);
}
~CDispCritical()
{
::DeleteCriticalSection(&m_Sect);
}
void Lock()
{
::EnterCriticalSection(&m_Sect);
}
void Unlock()
{
::LeaveCriticalSection(&m_Sect);
}
};
class CDispLock
{
private:
CDispCritical *m_pSect;
public:
CDispLock(CDispCritical& sect)
{

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 500分求这样一个类源码。

相关文章

  • 2017-06-05 用过cfgmgr32DLLcfgmgr32lib的进来
  • 2017-06-04 关于COM添加的函数的传入的参数的疑问
  • 2017-06-04 哪里能找到"Microsoftexcel80objectlibrary"
  • 2017-06-04 极其郁闷的问题,在ASP中先调用过的组件在另一个组件中调用就会堵塞
  • 2017-06-05 VB调用VC写的DLL问题!
  • 2017-06-05 刚刚想到个很白痴的问题,关于MFC的EXE
  • 2017-06-04 如何捕获浏览器滚动条事件的消息?
  • 2017-06-04 BSTR字符串的长度怎么获得啊?
  • 2017-06-04 cometohelp!!!!!
  • 2017-06-04 一个ActivXDll库,应该如何连接使用?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 急,如何给OCX家数字签名?
    • 如何获取在线播放器的播放信息
    • 求代码??一个可以时时更新的代码??每五分钟更新一次,夹加急!!
    • 使用IUnknow做基类,派生接口为什么会报基类未定义啊?(有代码)求高人指点!!!!
    • ADOCOM异常捕获不到,导致程序崩溃,怎么办?
    • 谁VS2008中调试过微软提供的SampleAtlButton?
    • VC学习以及运用中碰到的问题望前辈们帮忙帮忙!!!
    • 在VCNET里怎么调用一个封装在DLL里的COM组件啊,谢谢!!!急问!!!!!
    • powerpoint生成的pps文件可以显示在对话框中吗
    • activeX控件编写求救,用atl

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有