繁体   English   中英

使用 Dll 将 function 分配给传递给它的结构的指针成员函数

[英]Using Dll to assign a function to the Pointer-Member-Function of a structure passed to it

我的解决方案 (Visual Studio) 中有两个项目

我想分配function

void _OnCycle()
{
    printf("Success\n");
}

在 Dll(main.cpp) 中指向结构体 PluginCallbacks 的指针成员 function OnCycle

extern "C" unsigned int PluginInit(PluginFuncs * pluginFuncs, PluginCallbacks * pluginCalls, PluginInfo * pluginInfo) {
    pluginCalls->OnCycle = _OnCycle;
    return 1;
}

但是程序崩溃了。 完整代码如下。

//Project: ConsoleApplication1
//file: Dll1/ConsoleApplication1/ConsoleApplication1.cpp
#include <iostream>
#include "plugin.h"
#include <windows.h>

typedef unsigned int (__stdcall *PluginInit)(PluginFuncs* pluginFuncs, PluginCallbacks* pluginCalls, PluginInfo* pluginInfo);

int main()
{
    std::cout << "Loading first dll\n";

    HINSTANCE hGetProcIDDLL = LoadLibrary("../Release/Dll1.dll");

    if (!hGetProcIDDLL) {
        std::cout << "could not load the dynamic library" << std::endl;
        return EXIT_FAILURE;
    }

    // resolve function address here
    PluginInit funci = (PluginInit)GetProcAddress(hGetProcIDDLL, "PluginInit");
    if (!funci) {
        std::cout << "could not locate the function" << std::endl;
        return EXIT_FAILURE;
    }
    PluginFuncs a;
    PluginCallbacks b;
    PluginInfo c;
    std::cout << "PluginInit(a,b,c) returned " << funci(&a,&b, &c) << "\n";
    std::cout << "Now going to call OnCycle\n";
    b.OnCycle();
    std::cout << "Done";
    return EXIT_SUCCESS;
}
//Project: ConsoleApplication1
//file: Dll1/ConsoleApplication1/plugin.h
#pragma once
#include <stdint.h>

## Heading ##
typedef struct _Settings {
    uint32_t structSize;
    uint32_t flags;
} Settings;


typedef struct _PluginInfo {
    uint32_t structSize;
    char name[32];
} PluginInfo;

typedef struct _PluginFuncs {
    uint32_t structSize;
    uint32_t(*GetVersion) (void);
}PluginFuncs;

typedef struct {
    uint32_t structSize;
    void (*OnCycle) ();
}PluginCallbacks;

和第二个项目

//Project: Dll1
//file: Dll1/Dll1/main.cpp
#include "plugin.h"
#include "main.h"
#include "stdio.h"

void _OnCycle() { 
    printf("Success\n");
}
extern "C" unsigned int PluginInit(PluginFuncs * pluginFuncs, PluginCallbacks * pluginCalls, PluginInfo * pluginInfo) {
    printf("PluginInit called\n");
    pluginCalls->OnCycle = _OnCycle;
    return 1;
}
//Project: Dll1
//file: Dll1/Dll1/main.h
#define EXPORT __declspec(dllexport)
#include "plugin.h"

#ifdef __cplusplus
extern "C" {
#endif
    EXPORT  unsigned int            PluginInit(PluginFuncs* pluginFuncs, PluginCallbacks* pluginCalls, PluginInfo* pluginInfo);
#ifdef __cplusplus
}
#endif
//Project: Dll1
//file: Dll1/Dll1/plugin.h
#pragma once
#include <stdint.h>


typedef struct _Settings {
    uint32_t structSize;
    uint32_t flags;
} Settings;


typedef struct _PluginInfo {
    uint32_t structSize;
    char name[32];
} PluginInfo;

typedef struct _PluginFuncs {
    uint32_t structSize;
    uint32_t(*GetVersion) (void);
}PluginFuncs;

typedef struct {
    uint32_t structSize;
    void (*OnCycle) ();
}PluginCallbacks;

它构建但在执行时崩溃。

//Output
C:\Users\[hidden]\source\repos\Dll1\Release>ConsoleAPplication1
Loading first dll
PluginInit called
PluginInit(a,b,c) returned 1
Now going to call OnCycle

C:\Users\[hidden]\source\repos\Dll1\Release>

看,它因未打印“完成”消息而崩溃。

这是如何正确完成的?

看来我的问题是通过创建一个指针、对其进行 malloc 并将其传递给 dll 来解决的。这是一段代码

PluginFuncs* a = NULL;
    PluginCallbacks* b = NULL;
    PluginInfo* c = NULL;
    a = (PluginFuncs*)malloc(sizeof(PluginFuncs));
    b = (PluginCallbacks*)malloc(sizeof(PluginCallbacks));
    c= (PluginInfo*)malloc(sizeof(PluginInfo));
    std::cout << "PluginInit(a,b,c) returned " << funci(a,b, c) << "\n";
    std::cout << "Now going to call OnCycle\n";
    if (b && b->OnCycle)
        b->OnCycle();
    std::cout << "Done";

和 output

Loading first dll
PluginInit(a,b,c) returned 1
Now going to call OnCycle
Success
Done

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM