dll写的不规范,可能用class包了一层,无法从dumpbin看到dll的函数入口。
解决方案 »
- 急急急,IE9不兼容,无法JS实现打印功能
- 呐,我问个问题,关于combobox和textbox还有datagridview。
- 请问什么叫数据持久层
- 用MailMessage发送邮件,其中from地址是smtp方的邮件地址,该地址在接收方显示的位置是在主题的前面。请问在C#程序中用什么办法将这个位置上换成其它的邮箱地址,而不是smtp方的邮箱地址?
- 如何检查某个变量是否存在?
- 请教一个问题?麻烦了!
- BT下载:Visual Studio 2005 Enterprise Architect
- 谁有没有在vb,asp,vb.net,c#中算出来结果相同的MD5算法么
- 关于ICloneable接口的问题,也可能是关于引用的
- 又是一些问题:系统文件夹无法写入,无法创建程序快捷方式等等。
- 怎样才能把 NetworkStream 里的内容清空?
- 如何用C#程序实现端口的关闭?
Ptr.cpp:// Ptr.cpp : DLL 导出的实现。#include "stdafx.h"
#include "resource.h"
#include "Ptr.h"class CPtrModule : public CAtlDllModuleT< CPtrModule >
{
public :
DECLARE_LIBID(LIBID_PtrLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_PTR, "{F890D811-67EF-408A-BF64-727D1B963A86}")
};CPtrModule _AtlModule;
// DLL 入口点
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
hInstance;
return _AtlModule.DllMain(dwReason, lpReserved);
}
// 用于确定 DLL 是否可由 OLE 卸载
STDAPI DllCanUnloadNow(void)
{
return _AtlModule.DllCanUnloadNow();
}
// 返回一个类工厂以创建所请求类型的对象
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}
// DllRegisterServer - 将项添加到系统注册表
STDAPI DllRegisterServer(void)
{
// 注册对象、类型库和类型库中的所有接口
HRESULT hr = _AtlModule.DllRegisterServer();
return hr;
}
// DllUnregisterServer - 将项从系统注册表中移除
STDAPI DllUnregisterServer(void)
{
HRESULT hr = _AtlModule.DllUnregisterServer();
return hr;
}
#include "PtrFun.h"
#include ".\ptrfun.h"
// CPtrFun
typedef BOOL ( * pFun) (DWORD MsgID, LONG Param);
pFun mptrFun;
STDMETHODIMP CPtrFun::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IPtrFun
}; for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}STDMETHODIMP CPtrFun::GetFunPtr(CALLBACK * ptrFun)
{
// TODO: 在此添加实现代码
mptrFun = (pFun)ptrFun;
return S_OK;
}STDMETHODIMP CPtrFun::Eventa(LONG Num[1], LONG TemVal[1])
{
// TODO: 在此添加实现代码
long i,k;
i=Num[0];
k=TemVal[0];
if(mptrFun) (* mptrFun)(i, k);
return S_OK;
}
#include "resource.h" // 主符号#include "Ptr.h"
// CPtrFunclass ATL_NO_VTABLE CPtrFun :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CPtrFun, &CLSID_PtrFun>,
public ISupportErrorInfo,
public IPtrFun
{
public:
CPtrFun()
{
}DECLARE_REGISTRY_RESOURCEID(IDR_PTRFUN)
BEGIN_COM_MAP(CPtrFun)
COM_INTERFACE_ENTRY(IPtrFun)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); DECLARE_PROTECT_FINAL_CONSTRUCT() HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}public: STDMETHOD(GetFunPtr)(CALLBACK * ptrFun);
STDMETHOD(Eventa)(LONG Num[1], LONG TemVal[1]);
};OBJECT_ENTRY_AUTO(__uuidof(PtrFun), CPtrFun)
用regsvr32注册此com,通过引入com的方式来进行调用。
uint pCallBack =(uint)( Marshal.GetFunctionPointerForDelegate( ca ).ToInt32());