我正在将大量 .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)
任何人都可以提供解决方案吗?
我正在开发 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 类型库”) …
我需要将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:链接
我尝试自己实现链表。因此,当我向其中添加新数据时,我会使用类似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)
但我觉得这行不通,也行不通。
我有一个问题。我正在尝试将 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*是有时在这些情况下使用它,当您不知道您将收到什么时,然后将其转换为您需要的特定用法。
谢谢!
考虑以下片段:
void my_func(int a, void *b);
...
struct my_struct s = { };
my_func(10, (void *)&s);
Run Code Online (Sandbox Code Playgroud)
(void *)传递&s给函数时是否需要类型转换?
考虑以下代码:
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)
两个问题:
second初始化行上的成员的“剪切” shorn:像这样抛弃结构成员然后取消引用操纵的指针以访问其余成员是否有效?有人可以解释这背后的逻辑吗?为什么void?例如
#include <iostream>
using namespace std;
int main()
{
char c;
cout << (void *)&c;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 正如标题所说,当我做这样的事情时,有没有办法迫使海湾合作委员会警告我:
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) 我知道NULL指针是(void*)0.But当我们使用如下语句时会发生什么:
if(ptr==NULL)
Run Code Online (Sandbox Code Playgroud)
其中ptr可以是一个char,float或int指针?是NULL保证被隐式转换为左侧的类型,正如,例如,在C,类型通过返回malloc()是void*但隐式转换为左值的类型?