例如,winsock libs在所有版本的visual studio中都能很好地工作.但是我在为所有版本提供一致的二进制文件方面遇到了麻烦.使用VS 2005编译的dll在链接到2008年编写的应用程序时将无法工作.我将2k5和2k8升级到SP1,但结果没有太大变化.它的工作原理还可以.但是当他们将这个包含在C#应用程序中时,C#应用程序会出现访问冲突错误,但使用经典的C应用程序它可以正常工作.
当我提供dll时,我应该知道一个策略吗?
首先,除了传递DLL边界的普通旧数据之外,不要传递任何其他内容.结构很好.课不是.
其次,确保所有权不被转移 – 即,通过dll边界传递的任何结构都不会在dll之外被释放.因此,如果您导出X * GetX()函数,则会有相应的FreeX(X *)类型函数,确保分配的相同运行时负责取消分配.
原文链接:https://www.f2er.com/windows/372036.html其次,确保所有权不被转移 – 即,通过dll边界传递的任何结构都不会在dll之外被释放.因此,如果您导出X * GetX()函数,则会有相应的FreeX(X *)类型函数,确保分配的相同运行时负责取消分配.
下一步:获取DLL以链接到静态运行时.将来自多个第三方的dls组合在一起,每个第三方链接并期望不同的运行时,可能与应用程序预期的运行时不同,这是一种痛苦,可能会迫使安装程序软件安装7.0,7.1,8.0和9.0的运行时 – 其中一些存在于不同的服务包中,这可能会或可能不会引起问题.善待 – 静态链接你的dll项目.
– 编辑:
您无法使用此方法直接导出c类.在模块之间共享类定义意味着您必须具有同类运行时环境,因为不同的编译器或编译器版本将以不同方式生成装饰名称.
您可以通过将类导出为COM样式接口来绕过此限制…也就是说,虽然您无法以独立于运行时的方式导出类,但您可以导出“接口”,您可以通过声明来轻松实现一个只包含纯虚函数的类……
struct IExportedMethods { virtual long __stdcall AMethod(void)=0; }; // with the win32 macros: interface IExportedMethods { STDMETHOD_(long,AMethod)(THIS)PURE; };
在您的类定义中,您从此接口继承:
class CMyObject: public IExportedMethods { ...
你可以通过制作C工厂方法来导出这样的接口:
extern "C" __declspec(dllexport) IExportedClass* WINAPI CreateMyExportedObject(){ return new CMyObject; }
这是一种非常轻量级的导出编译器版本和运行时独立类版本的方法.请注意,您仍然无法删除其中一个.您必须包含释放功能作为dll或接口的成员.作为界面的成员,它可能如下所示:
interface IExportedMethods { STDMETHOD_(void) Release(THIS) PURE; }; class CMyObject : public IExportedMethods { STDMETHODIMP_(void) Release(){ delete this; } };
您可以采用这个想法并继续使用它 – 从IUnknown继承您的接口,实现ref计数AddRef和Release方法以及查询接口或其他功能的QueryInterface的能力.最后,使用DllCreateClassObject作为创建对象并获得必要COM注册的方法.所有这些都是可选的,但是,您可以轻松地通过C函数访问简单的接口定义.