SWIG的C函数指针和JAVA
我在C中有一些代码,其中一种方法具有函数指针作为参数.我正在尝试在我的Android应用中使用C代码. 我决定使用SWIG来生成所需的Java文件的所有工作.一切都可以与常规函数(没有函数指针作为参数)一起工作. ,但我不确定如何将我的Java方法作为回调C函数. 这是一个示例: 这是我的乘法.H文件 typedef int (*callback_t) (int a, int b, int c); int foo(callback_t callback); 这是我的乘法.C文件 #include #include "multiply.h" int foo(callback_t callback) { return callback(2, 4, 6); } 这是我的接口文件乘数 %module example %{ /* Includes the header in the wrapper code */
14 2024-02-04
编程技术问答社区
在VBA中定义一个函数别名,可能吗?
我正在使用MS Access后面的VBA 假设我有foo1和foo2的全局方法,这些方法会得到相同的论点,但要做不同的事情. 我知道在C ++中,我可以将功能分配一个别名.就像是: 而不是: If (term) then foo1 arg1, arg2, arg3 else foo2 arg1, arg2, arg3 End If 我想写: Var new_func = Iff (term, foo1,foo2) new_func arg1, arg2, arg3 我可以在VBA上执行此操作吗? 解决方案 会穿西装吗? new_func = IIf(term, "foo1", "foo2") ''new_func arg1, arg2, arg3 res = Run(new_func, "a", "b", 1) 更多信息:/library/aa199108(Office.10).aspx 其他解决方案 如果在2个不同的类模块中实
10 2024-01-23
编程技术问答社区
在表达式中支持" OUT/REF"参数,并转换为"对象"
我的这个问题旅程始于乔恩·斯基特(Jon Skeet)文章的实施:"进行反思飞行并探索代表" : ,他说: 注意:我将通过调用DateTime.Adddays来证明这一点原始,双天)致电CreateLegate.这是可行的,但有点像.特别是,您不能使用func ,因为没有任何补充参数. 我正在使用自己的代表来支持这一点,而我完全很困惑,试图在c#.net 4.0中创建编译表达式以支持" out/ref",但将代表类型转换为"对象". 在下面运行代码时,我在第一种情况下获得了预期输出,但是在第二种情况下(当我将输入和输出参数转换为type:object:object),未分配" out"参数,并且结果是"之前"而不是"之后". public class Test { public delegate void myDelegate(T test, out U setMe); public void myFunct
2 2024-01-07
编程技术问答社区
变量参考作为函数参数
所有关于带有动作辅助器的Zend应用程序的信息. 我想通过函数解开一些对数组. helper: class Application_Controller_Action_Helper_TestHelper extends Zend_Contr[...] { public function direct(&$array) { if(isset($array['key'])) unset($array['key']); } } controller: $this->_helper->TestHelper($var); 我该如何工作? 解决方案 您还必须将其作为参考: 传递 $this->_helper->TestHelper(&$var); 更新: UPS,我的错误关闭了.您(现在我)正在遇到错误 函数调用上没有参考符号 - 仅在函数上 定义.仅功能定义就足以正确通过 参考
4 2023-12-26
编程技术问答社区
在x64中调用绝对地址
我无法弄清楚,我可以做这样的指示,而且它没有问题 call ffffdd80d60e4000 但是我将如何将其转换为字节?我查看了记忆中的指示,并显示了 之类的怪异事物 0xe8 0x00 0x40 0x0e 0xd6 我唯一可以识别的是e8是呼叫操作码.有人可以解释其他4个字节是什么,如果我需要调用的地址为dword64值,我该如何将这样的指令转换为字节数组?我尝试了,我不能简单地复制地址的字节,然后在开始时添加0xE8. 抱歉,如果这可能是一个愚蠢的问题,但是我在书籍和网站上搜索,找不到任何内容. 正如杰斯特所说, 解决方案 通常使用相对地址.如果要使用绝对地址,则可以将目的地放在这样的寄存器中: 48 b8 00 40 0e d6 mov rax, 0xffffdd80d60e4000 80 dd ff ff ff d0 call rax 您也可以调用内存中的地址.例如,如果目标地址在[RSP+8
2 2023-12-16
编程技术问答社区
写一个thunk来验证SysV ABI的合规性
我想编写一个通用的thunk,该通用thunk验证一个函数满足了对Callee保存的寄存器的ABI限制,并且(也许)试图返回一个值. 因此,鉴于int foo(int, int)的目标函数,在汇编中写下这样的thunk很容易,例如 1 : foo_thunk: push rbp push rbx push r12 push r13 push r14 push r15 call foo cmp rbp, [rsp + 40] jne bad_rbp cmp rbx, [rsp + 32] jne bad_rbx cmp r12, [rsp + 24] jne bad_r12 cmp r13, [rsp + 16] jne bad_r13 cmp r14, [rsp + 8] jne bad_r14 cmp r15, [rsp] jne bad_r15 ret 现在,当然我实际上并不想为每个呼叫编写一个单独的foo_thunk方法,我只想要一个通用的方法.这个应该将指针指向基
2 2023-12-15
编程技术问答社区
RET之后的指令总是CALL之后的指令吗?
在行为良好的C计划中,返回声明(ret)是否始终在呼叫声明之后返回指令?我知道这是默认值,但是我想检查任何人是否知道或记住该标准不适用的案例的真实示例(常见的编译器优化或其他事项...).有人告诉我,它可能会在功能指针中发生(功能指针将值放在堆栈上,而不是呼叫...我搜索了它,但我在任何地方都没有看到解释). 让我尝试更好地解释我的问题.我知道我们可以使用其他结构来更改执行流(包括操纵堆栈)...我知道,如果我们更改堆栈上写的返回地址,则执行流将更改为堆栈上写的地址.我需要知道的是:是否没有任何不寻常的执行情况,下一个指令不是呼叫的指令?我的意思是,除非发生意外发生的事情(例如,内存访问会导致结构化的异常处理程序). 我担心的是商业应用程序一般是否始终遵循上述模式.请注意,在这种情况下,我对例外情况有固定的固定(重要的是要知道它们是否存在于这种情况下,对于我正在发展为M. Sc.计划的纪律的研究项目).例如,我知道,编译器有时可能会将RET更改为JMP(尾部呼叫优化).我想知
2 2023-12-15
编程技术问答社区
函数指针是否会迫使指令流水线清空?
现代CPU具有广泛的管道,即,他们在实际执行指令之前很久就加载了必要的说明和数据. 有时,加载到管道中的数据被无效,并且必须清除管道并使用新数据重新加载.重新填充管道所需的时间可能是相当大的,并导致性能放缓. 如果我在C中调用函数指针,管道是否足够聪明,可以意识到管道中的指针是函数指针,并且应该遵循下一个指令的指针?还是有功能指针会导致管道清除并降低性能? 我在C中工作,但我想这在C ++中更为重要,其中许多函数调用都是通过V-表. 编辑 @jensgustedt写道: 成为功能调用的真实性能,您的功能 通话必须非常简短.如果您通过测量您的 代码,您绝对应该重新审视您的设计以允许该调用 被内衬 不幸的是,这可能是我陷入的陷阱. 我出于性能原因而写的目标功能小而快速. 但是它由功能点引用,因此可以轻松地用其他功能替换(只需使指针引用一个不同的函数!).因为我是通过功能点来指代的,所以我认为它可以被列入. 所以,我的功能极为简短,不发明
4 2023-12-15
编程技术问答社区
C++: 通用函数封装类作为非模板类的成员
我正在尝试实现一个可以接受用户提供的测量模型功能的Kalman过滤类,该功能可以具有任何数量的参数.如果您不熟悉Kalman过滤器,这并不重要,基本上,我有一个非模板类,该类带有模板构造函数,该类别的构造函数可以接收具有任何类型的任何参数的函数.然后,构造函数将传递的函数分配给函数包装构件对象,该函数包装器成员对象本身是基于variadic模板类构建的.我遇到的问题是如何将功能包装对象声明为我的卡尔曼过滤器类的成员,而又不知道将传递给构造函数的函数的特定形式? 我深表歉意,如果这不是很清楚.但是,我基本上一直在关注 this 答案对 this 问题,line auto add = make_action([] (int a, int b) { std::cout #include
0 2023-12-15
编程技术问答社区
用Objective-C函数指针包装C库
我正在Objective-C中的C库周围编写包装器.该库允许我在某些事件发生时注册回调功能. register_callback_handler()函数将功能指针作为参数之一. 我向您提出的编程大师的问题是:如何表示Objective-C方法呼叫/选择器作为函数指针? 在这种情况下,NSINEVOCATIC是有用的吗? 我会更好地仅编写包含方法调用的C函数,然后将指针传递给该功能? 任何帮助都很好,谢谢. 解决方案 register_callback_handler()也要采用(void*)上下文参数吗?大多数回调API都可以. 如果这样做,那么您可以很容易地使用NSInInvocation.或者,您可以分配一个包含对象和选择器的引用,然后将您自己的调用弄脏的小结构. 如果仅采用函数指针,则可能是软管.您需要在唯一识别上下文的地方,即使对于纯C编码也是如此. 鉴于您的回调处理程序 do 具有上下文指针,您都设置了: typedef
2 2023-12-15
编程技术问答社区
将c++的lambda传递给老的c函数指针
我必须为旧的C库创建C ++包装器. 在类方法中,我必须调用一个C函数,该C函数也与其他内容一起使用,也是一个功能指针(这是一个事件处理程序,并且该功能采用事件发生时触发的函数). 一个简单的例子是: void myclass::add_handler(std::function handler, otherstuff...) { /* * Many things. */ type_of_function_pointer_accepted_by_old_c_library_add_handler nameofvariable = [handler](same_arguments_as_in_definition_of_the_old_c_function_pointer_accepted) { /* * Many other things with other s
2 2023-12-15
编程技术问答社区
运行时检查失败 #0 从kernel32.dll加载QueryFullProcessImageName
我有一个需要在WinxP和Vista64上运行的应用程序.我的程序需要QueryFullProcessimageName()才能在Vista上工作,但在XP上不工作. 我尝试加载queryfullprocessimagename()(而不是通过kernel32.dll链接静态),以便同一可执行文件可以在WinxP和Vista上运行.加载的代码是: //only gets called on vista bool LoadQueryFullProcessImageName() { HMODULE hDLL = LoadLibrary("kernel32.dll"); if (!hDLL) return(0); //Now use pointer to get access to functions defined in DLL fpQueryFullProcessImageName = (LPQueryFullProcessImageName)GetProcA
6 2023-12-09
编程技术问答社区
从dll中导出一个函数指针
我在DLL文件中有一个功能指针(在实现中,而不是标题)中.我该如何调用EXE源代码中此指针指向的函数? 解决方案 您可以导出返回指针的功能. 标题: typedef void ( *MyPtr ) (); __declspec( dllexport ) MyPtr GetMyPtr(); 来源: MyPtr GetMyPtr() { //retunr the function pointer here }
6 2023-12-05
编程技术问答社区
创建线程不接受成员函数
我正在尝试创建一个用于网络编程的类.这将创建一个带有线程的通用套接字. 但是,当我尝试使用createThread()将线程杂货时.第三个论点是产生错误.从网络中,我知道我不能将成员函数用作createThread()的参数. 有什么可以实现的? 解决方案 在Lost我明白了,事实是,在 CreateThread 中,如果您通过插座,那么毫无麻烦.因为 createThread 是 套接字.但是,如果您将其作为具有套接字的对象,那么 createThread 是不要照顾 socket ,并且最终以无效的插座在新线程中. 下面的成功代码 SOCKET s=socket(....); bind(s,...); listen(s,...); SOCKET temp=accept(s,(sockaddr *)&addrNew,&size); DWORD threadId; HANDLE thread=CreateThread(NULL,0,&MyThreadFun
2 2023-12-05
编程技术问答社区
为什么需要使用 "WINAPI*"作为在DLL中声明函数指针的语法?
我有一个C ++控制台应用程序和一个DLL.在C ++应用程序中,我看到以下片段:: typedef DWORD (WINAPI* functABC)(unsigned long*); functABC functABC111; HMODULE handleDLL = LOadLibrary("a.DLL"); functABC111 = (functABC)GetProcAddress(handleDLL,"function_1"); 在高水平上,我知道我们正在获取a.dll" function_1()"函数的功能指针. ,但想了解上述摘要中的第一个2行:: typedef DWORD (WINAPI* functABC)(unsigned long*); functABC functABC111; 2个问题:: 1)名称" functabc"只是一个随机函数指针名称? 2)我们在这两条线上做什么.声明功能指针. 3)为什么我们需要在第一行的功能指针声明
0 2023-12-04
编程技术问答社区
用于winapi函数的函数指针(stdcall/cdecl)。
请有人可以给我一些为Winapi功能创建功能指针的提示吗?我正在尝试为DefwindowProc(DefwindowProca/defwindowProcw)创建一个指针,但要获得此错误: LRESULT (*dwp)(HWND, UINT, WPARAM, LPARAM) = &DefWindowProc; error C2440: 'initializing' : cannot convert from 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' to 'LRESULT (__cdecl *)(HWND,UINT,WPARAM,LPARAM)' 我不知道我需要使用什么,因为我不习惯MS ASCII/Wide宏.顺便说一句,我正在创建一个功能指针来快速入侵,不幸的是,我没有时间解释原因 - 但是无论如何,我认为这个问题对需要创建Winapi功能指针的人有帮助. 更新: 此代码有效,但我担心这是不良练习(并且不
6 2023-12-04
编程技术问答社区
如何解决围绕调用FARPROC的GetProcAddress的C4191警告?
最近我尝试使用/wall visual C ++选项启用所有警告并发现以下代码: typedef BOOL ( WINAPI * TIsWow64ProcessFunction )( HANDLE, BOOL* ); TIsWow64ProcessFunction isWow64ProcessFunction = reinterpret_cast ( ::GetProcAddress( kernel32DllHandle, "IsWow64Process" ) ); 产生 c4191 c4191 : warning C4191: 'reinterpret_cast' : unsafe conversion from 'FARPROC' to 'TIsWow64ProcessFunction' Calling this function through the result pointer may cause you
0 2023-12-04
编程技术问答社区
C 将参数作为void-pointer-list传递给LoadLibrary()的导入函数。
我遇到的问题是我要创建一个通用命令行应用程序,该应用程序可用于加载库DLL,然后在库DLL中调用函数.该函数名称在命令行上指定,并在实用程序命令行上提供的参数. i可以使用LoadLibrary()函数动态加载的DLL访问外部功能.加载库后,我可以使用GetProcAddress()获得指向该函数的指针,我想用命令行上指定的参数调用该函数. 我可以将一个void-pointer-list传递给我从LoadLibrary()函数返回的函数销钉,类似于下面的示例? 为了使示例代码保持简单,我删除了错误检查.有没有办法使这样的事情有效: //Somewhere in another dll int DoStuff(int a, int b) { return a + b; } int main(int argc, char **argv) { void *retval;
8 2023-12-04
编程技术问答社区
将一个函数指针从一种类型投向另一种类型的最好方法是什么?
我已经搜索了堆栈溢出以寻求答案,但是我没有任何特定的问题:仅有关使用各种类型的铸造运算符的一般案例. 因此,这个例子是使用Windows GetProcAddress() API调用检索函数地址,该函数返回类型FARPROC>的函数指针,with:typedef INT_PTR (__stdcall *FARPROC)();. 麻烦是,如下MRCE代码所示,很少(如果有的话)(如果有的话)具有此实际签名.在此代码中,我显示了各种不同的尝试将返回值转换为适当类型的函数指针的尝试,除了第四种方法外,所有方法都评论了: #include #include typedef DPI_AWARENESS_CONTEXT(__stdcall* TYPE_SetDPI)(DPI_AWARENESS_CONTEXT); // Function pointer typedef static DPI_AWARENESS_CONTEXT __stdca
6 2023-12-04
编程技术问答社区
使用函数指针的泡沫排序
我正在尝试通过使用指针功能来实现C中的气泡排序,但行不通.谁能帮我?这是代码: #include #include void bubbleSort(void** base, size_t length, int (*compar)(const void*, const void*)); int main(int argc, char* argv[]) { int cmp(const void*, const void*); int vet[] = {1, 2, 5, 7, 6, 1, 3, 2, 9, 15, 14, 20}; bubbleSort((void**) &vet, sizeof(vet)/sizeof(vet[0]), cmp); int i; for (i = 0; i
8 2023-11-25
编程技术问答社区