标签: void-pointers

在 C++/CLI 中 void* 到 Object^

我正在将大量 .h 和 .lib 文件从本机 C++ 包装到托管 C++,以最终用作 C# 中的引用 .dll。

一些本机 C++ 函数的返回类型为 void*。当我将值传递回调用代码时,我不确定如何处理这个问题。例如:如果 C# 应用程序调用我的 dll 包装器,我从本机调用返回什么:

void* start(ThreadFunc,void *, unsigned *);
Run Code Online (Sandbox Code Playgroud)

我目前正试图在一个通用的 System::Object^ 中装箱返回,但没有运气。这是包装器中的调用:

m_NativeThread->start(cb, 
        GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(),
        static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer())));
Run Code Online (Sandbox Code Playgroud)

任何人都可以提供解决方案吗?

c++-cli wrapper void-pointers

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

如何在 IDL 中声明 void* 类型的参数

我正在开发 ATL 项目。一些接口包含传递各种指针的参数。这是我的 IDL 文件:

import "oaidl.idl";
import "ocidl.idl";
[
    object,
    uuid(618E64F5-676B-4A13-A513-DE3D4097294A),
    dual,
    nonextensible,
    helpstring("IMyObject Interface"),
    pointer_default(unique)
]
interface IMyObject : IDispatch{
    [id(1), helpstring("method Make")] HRESULT Make(DWORD type, LPVOID settings);
    [id(2), helpstring("method Deserialize")] HRESULT Deserialize(LPVOID dataPtr, DWORD dataSize);
};
[
    uuid(E57065B4-498F-4347-9ACC-A2C86A771720),
    version(1.0),
    helpstring("TestComVoid 1.0 Type Library")
]
library TestComVoidLib
{
    importlib("stdole2.tlb");
    [
        uuid(1DC2528B-EA49-4F89-BB56-B1D667379644),
        helpstring("MyObject Class")
    ]
    coclass MyObject
    {
        [default] interface IMyObject;
    };
};
Run Code Online (Sandbox Code Playgroud)

IMyObject 的第一种方法根据类型和对应的结构构造一个对象。第二种方法基于二进制数据构造一个对象。

但我收到错误 MIDL2139:参数的类型不能从 void 或 void * 派生

另外,我想制作一个带有 IntPtr 参数的 C# 包装器来传递指针。(“添加引用”->COM->“TestComVoid 1.0 类型库”) …

com idl atl void-pointers

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

int to void *-避免使用C样式转换?

我需要将int(指定一个字节偏移量)强制转换为const void*。真正适合我的唯一解决方案是c样式强制转换:

int offset = 6*sizeof(GLfloat);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)offset);
Run Code Online (Sandbox Code Playgroud)

我想摆脱c风格的转换,但找不到有效的解决方案。我试过了

static_cast<void*>(&offset)
Run Code Online (Sandbox Code Playgroud)

并进行编译,但这不是正确的解决方案(此方法的整体输出有所不同)。正确的解决方案是什么?

链接至的文档glVertexAttribPointer链接

c++ opengl pointers casting void-pointers

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

如何获取 void 指针数据的副本

我尝试自己实现链表。因此,当我向其中添加新数据时,我会使用类似node->data = datawhere的内容data is (void*) type。所以我想通过意外编辑添加的变量来防止数据损坏。

例如:

int data = 10;
LinkedList_add(list, (void*)&data);
...
/* It will modify value in list */
data = new value; 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我尝试这样复制它:

 void* data_copy;
 *data_copy = *_data;
Run Code Online (Sandbox Code Playgroud)

但我觉得这行不通,也行不通。

c pointers copy void void-pointers

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

将 void* 转换为 std::function

我有一个问题。我正在尝试将 void* 转换为 std::function 。这只是一个简单的例子,任何建议将不胜感激

#.h file
class Example {

public:

  Example();
  int foo(void* hi);

  int fooFunc(std::function<int(int, int)> const& arg, int x, int y) {
    foo(arg.target<void*>(), x, y);
    return 2;
  }

};


#.cpp file
Example::Example() {

  }

  int Example::foo(void * func, int x, int y)
  {
    //cast back to std::function
    func(x, y);
    std::cout << "running in foo: " << a << "\n";
    return a;
  }
Run Code Online (Sandbox Code Playgroud)

我尝试的每一次选角都不起作用。

我知道我可以在这个例子中发送一个std::function,但这是为了更大的事情,我正在研究一个例子以使其在这里工作。

,的全部含义void*是有时在这些情况下使用它,当您不知道您将收到什么时,然后将其转换为您需要的特定用法。

谢谢!

casting void-pointers c++11 std-function

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

将指针传递给对象时类型转换为 (void *)

考虑以下片段:

void my_func(int a, void *b);
...

struct my_struct s = { };
my_func(10, (void *)&s);
Run Code Online (Sandbox Code Playgroud)

(void *)传递&s给函数时是否需要类型转换?

c types pointers casting void-pointers

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

比较结构指针、丢弃成员和 UB

考虑以下代码:

int main()
{
    typedef struct { int first; float second; } type;

    type whole = { 1, 2.0 };
    void * vp = &whole;

    struct { int first; } * shorn = vp;
    printf("values: %d, %d\n", ((type *)vp)->first, shorn->first);
    if (vp == shorn)
        printf("ptrs compare the same\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 指针相等比较是UB吗?
  2. 关于second初始化行上的成员的“剪切” shorn:像这样抛弃结构成员然后取消引用操纵的指针以访问其余成员是否有效?

c casting strict-aliasing void-pointers undefined-behavior

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

为什么`(void *)&amp;`会得到变量的地址?

有人可以解释这背后的逻辑吗?为什么void?例如

#include <iostream>
using namespace std;
int main()
{
    char c;
    cout << (void *)&c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ casting operator-overloading c-strings void-pointers

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

GCC警告隐式转换void*到另一个指针类型

正如标题所说,当我做这样的事情时,有没有办法迫使海湾合作委员会警告我:

void do_something(int* ptr)
{
    // do something
}

int main()
{
    int a = 123;
    void* b = &a;

    // WARN HERE:
    do_something(b);
}
Run Code Online (Sandbox Code Playgroud)

c gcc warnings casting void-pointers

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

当我们对整数指针ptr使用"if(ptr == NULL)"时,NULL指针是否隐式转换为type(int*)?

我知道NULL指针是(void*)0.But当我们使用如下语句时会发生什么:

  if(ptr==NULL)
Run Code Online (Sandbox Code Playgroud)

其中ptr可以是一个char,floatint指针?是NULL保证被隐式转换为左侧的类型,正如,例如,在C,类型通过返回malloc()void*但隐式转换为左值的类型?

c casting void-pointers null-pointer

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