小编Fru*_*oul的帖子

c++ dll windows插件架构方法

正如标题所暗示的那样,我的第一种插件架构方法遇到了麻烦,我希望得到一些建议,但让我具体说一下……

假设您有一个带有一些定义方法的纯抽象类 BASE... 假设您还有一个主要的可执行文件,以及一个在运行时与主要可执行文件动态链接的 dll 文件...BASE 位于包含在主文件中的头文件中exe 和 dll... BASE 子类在 dll 中定义,并实现了它们的抽象方法... Main exe 分配了一个指向 BASE 的指针数组。该数组被传递给 dll。dll 在堆上创建对象,并返回填充有指向这些对象实例的指针的数组。

问题是,当我尝试在主 exe 上的那些实例之一上调用 BASE 的成员方法时(应该由派生类在 dll 中重载),我收到访问冲突错误。我没有通过我为主要可执行文件和 dll 定义的 c 接口传递类或任何特定于 c++ 的东西......只是指针......

这实际上只是出于学术目的,但我仍然在考虑可能不同的人会为主程序创建插件(dll)的想法,因此兼容性是一个问题。所以我认为将 dll 的接口保留在 c 中是个好主意,您不同意吗?

我认为 dll 和主可执行文件共享相同的堆空间,所以指向对象实例的指针应该可以工作,不是吗?

另一方面,指向对象的指针只会给主程序一个内存中存储实例变量的位置,但没有关于其方法代码的信息,主程序对此一无所知,因为它是在 dll 中定义的. 所以如果没有可执行代码的地址,它就不能调用抽象类的方法实现是合乎逻辑的。到目前为止,我的推测是否正确?

我知道我可以使用保存在每个对象中的函数指针,但这不会破坏 C++ 好的内置多态机制吗?

另一种方法是,因为 BASE 的抽象方法是已知的,所以为每个 BASE 类的方法实现一个 c 风格的函数(在 dll 的 c 接口中),并带有一个额外的参数,即对象的 ptr。通过这种方式,可以在特定对象的 dll 内处理实现的方法。我非常不喜欢这个主意。使dll的接口更大,使用了大量的c函数,几乎使派生类的处理成为c风格,或者至少需要包装在其他c++类中。你对此有什么想法?

我主要问社区的是:我尝试这样做的方式是正确的方法吗?还是我的想法完全错误?我错过了什么重要的东西吗?你还有什么建议?

非常感谢您的时间和支持。

更新: 由于我无法弄清楚我做错了什么,我将求助于上传我的代码......

主程序 - .cpp 文件

#include "feats.h"

using namespace std;
typedef void* (__cdecl *_connect)(void);

void …
Run Code Online (Sandbox Code Playgroud)

c++ dll plugins

5
推荐指数
1
解决办法
1229
查看次数

Linux Fork Process终止

//Executing shell command ls -l | sort
int *pipeIN, *pipeOUT;

int runLS(){
    char* parmListLS[] = { "ls", "-l", NULL };
    int pid = fork();
    if(pid==0){
        close(*pipeIN);
        dup2(*pipeOUT, STDOUT_FILENO);
        execvp(parmListLS[0], parmListLS);
    }else return pid;
}

int runSORT(){
    char* parmListSORT[] = { "sort", NULL };
    int pid = fork();
    if(pid==0){
        close(*pipeOUT);
        dup2(*pipeIN, STDIN_FILENO);
        execvp(parmListSORT[0], parmListSORT);
    }else return pid;
}

int main(void){
    int pidLS, pidSort, pipeId[2];
    pipeIN = &pipeId[0], pipeOUT = &pipeId[1];
    pipe(pipeId); //open pipes

    pidLS = runLS();
    pidSort = runSORT();

    printf("PIDS: LS …
Run Code Online (Sandbox Code Playgroud)

c linux shell fork pipe

2
推荐指数
1
解决办法
83
查看次数

C/C++ 声音操作系统 API

我有一个关于声音的问题。我之前在我的项目中使用过像 OpenAL 这样的声音库。我需要的是了解这些库使用的底层操作系统 API。即使每个库都提供了一种根据格式操作输入文件的简单方法,但非常基本的“原始字节到字节,发送到驱动程序”功能也必须存在。

我的意思是,这些库肯定必须有一个默认的 api(一个用于 Windows,另一个用于 Linux)。我不认为他们直接使用每个声卡的驱动程序,因此操作系统必须以某种方式发挥作用。我对么?

现在,我知道 DirectX 支持声音(虽然我从未使用过),但是 Windows 上默认情况下没有安装 DirectX,所以我想它不算数,而且我不知道 Linux 上会发生什么,我想了解两者。

我知道不使用专用库可能是不切实际的,而且我并不是真的不想这样做,但我对这个主题很好奇。所以请纵容我吧。

那么,对于基本图形来说,它是 OpenGL 和 DirectX...但是声音呢?

先感谢您。

c c++ linux windows audio

2
推荐指数
1
解决办法
7202
查看次数

如何从一个流复制到另一个流?

我想知道从性能角度来看,使用 C++ fstream 库将数据序列从任意二进制文件复制到另一个二进制文件中的最佳方法是什么。

序列大小可以是任意大小,从几个字节到数百兆字节。

一种方法当然是使用中间内存缓冲区。如果这是正确的方法,您会考虑多大的中间缓冲区?

另一种(更好的)方法是什么?

编辑:
我应该提到,要求是从第一个流中的任意位置复制到第二个流中的任意位置。

c++

1
推荐指数
1
解决办法
186
查看次数

C++运算符重载模板类

我正在尝试编写一个覆盖给定类的某些函数的模板类.一个简单的例子最好描述我正在尝试做的事情......

#include <iostream>
using namespace std;

class box{
public:
    void print(){ cout << "Good!"; }
};

template <class T>
class shadow{
    T obj;
public:
    T& operator. (void) { return obj; }
};

int main(void){
    shadow<box> t;
    t.print();
}
Run Code Online (Sandbox Code Playgroud)

检查主要我想做什么.我想通过模板类模拟对一个box'方法的调用.这似乎是运营商'.' 不能超载.我设法得到的最接近的是重载operator().

T& operator() (void) { return obj; }
Run Code Online (Sandbox Code Playgroud)

并在main中调用t().print().你能提出一个更好的方法去做我想做的事吗?提前致谢.

ps:我真的必须这样做,我不想使用继承.

c++ templates

0
推荐指数
1
解决办法
126
查看次数

标签 统计

c++ ×4

c ×2

linux ×2

audio ×1

dll ×1

fork ×1

pipe ×1

plugins ×1

shell ×1

templates ×1

windows ×1