从非托管DLL中读取变量(结构数组)

时间:2014-04-21 15:43:53

标签: c# c dll struct unmanaged

我需要你的帮助。

我将以下c代码作为dll(无法重新编译或更改):

 typedef struct {
/* The name of the test */
char *name;

/* The SHORT name of the test (its call name) */
char *sname;

/* pointer to a test description */
char *description;

/* Standard test default */
unsigned int psamples_std;

/* Standard test default */
unsigned int tsamples_std;

/* Number of independent statistics generated per run */
unsigned int nkps;

/* A pointer to the test itself (must be filled at initialization) */
int (*test)();

/* void pointer to a vector of additional test arguments */
void *targs;

} Dtest;

这个结构在数组中的dll中使用,如下所示:

 Dtest *dh_test_types[1000];

经过大量研究后,我发现了一种通过以下方法从DLL中获取“简单类型”变量的方法:

IntPtr hdl;
hdl = LoadLibrary("cygdieharder-3.dll");
IntPtr addr = GetProcAddress(hdl, "dh_test_types");

对于我使用的简单类型

int value = Marshal.ReadInt32(addr);

但是我无法获得有关URL中“Dtest”结构数组的任何信息,因为没有像Marshal.readDtest(addr)

的内容。

如果有人可以帮助我,那就太棒了。

期待你的感谢

1 个答案:

答案 0 :(得分:0)

鉴于您的结构定义如上,以及变量:

Dtest *dh_test_types[1000];  
从该typedef定义

,然后可以通过这种方式访问​​指向struct(包含100个元素)的指针数组:

    dh_test_types[0]->name;
    dh_test_types[0]->sname;
    dh_test_types[0]->description;
    dh_test_types[0]->psamples_std;
    dh_test_types[0]->sname;
    dh_test_types[0]->targs;
    dh_test_types[0]->test;
    dh_test_types[0]->tsamples_std;  
//...  all the rest of indices...
    dh_test_types[99]->name;
    dh_test_types[99]->sname;
    dh_test_types[99]->description;
    dh_test_types[99]->psamples_std;
    dh_test_types[99]->sname;
    dh_test_types[99]->targs;
    dh_test_types[99]->test;
    dh_test_types[99]->tsamples_std;   

介于两者之间