首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >COM Server:(尤指调用接口方法时未通过函数调用保存)

COM Server:(尤指调用接口方法时未通过函数调用保存)
EN

Stack Overflow用户
提问于 2012-10-29 11:18:11
回答 1查看 302关注 0票数 2

我正在EXE文件中实现COM服务器。准确地说,我正在向现有的应用程序中添加一个COM接口。最终目标是自动化应用程序。

第一个组件和一个接口(到目前为止只有一个方法)基本上已经就位。我可以在DLL中构建一个interface服务器,并成功地获得一个接口指针并调用该方法。这是作为第一步做的,因为我只是在学习。稍后我将不需要DLL;它只是作为概念的证明,即我的组件和接口基本上是正常的。

然后我在EXE中构建了一个进程外服务器。我已经到了可以从客户端调用CoCreateInstance()的地步了,EXE已经启动,注册了它的工厂,并且工厂创建了组件的一个实例。CoCreateInstance返回S_OK,客户端接收一个非空的接口指针。

当我调用接口的方法时,问题就会发生。

  • 首先,方法中的断点没有被击中(是的,它在另一个进程中,但我也在调试服务器。服务器中的其他断点被击中ok)。
  • 其次,客户端报告Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

我绝对知道COM接口中的方法必须使用__stdcall,并且我已经检查过几次,它没有丢失。此外,组件(C++)的实现来源于MIDL生成的接口。因此,接口的头文件具有正确的调用约定,如果组件的头文件没有,编译器会抱怨覆盖不同。

由于断点甚至没有命中,我的直觉是,从根本上讲,本地过程调用有一些问题,比如vtbl没有正确设置。有没有人有什么建议会导致观察到的行为?有关于如何调试代理/存根代码的技巧吗?

编辑:

作为对WhozCraig的响应,这里的IDL文件:

代码语言:javascript
运行
AI代码解释
复制
import "unknwn.idl";

// Interface IMyApp1
[
   object,
   uuid(440EA043-DF6D-4df9-963D-7660BBA829EF),
   helpstring("IMyApp1 Interface"),
   pointer_default(unique)
]

interface IMyApp1: IUnknown
{
   HRESULT ShowAboutBox(void);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-30 14:18:55

我发现了问题。这是一个相当尴尬的错误,但有趣的是,它会导致观察到的效果,所以我会张贴在这里,以防其他人有同样的问题。

客户在做什么

代码语言:javascript
运行
AI代码解释
复制
HdResult = CoCreateInstance(
   sClassIdApp,
   NULL,
   CLSCTX_LOCAL_SERVER,
   IID_IUnknown,   // Oops...
   (void**) &pInterface);

pInterface->ShowAboutBox();

而不是

代码语言:javascript
运行
AI代码解释
复制
HdResult = CoCreateInstance(
   sClassIdApp,
   NULL,
   CLSCTX_LOCAL_SERVER,
   IID_IMyApp1,
   (void**) &pInterface);

pInterface->ShowAboutBox();

呃..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13128199

复制
相关文章
应用性能监控接口调用问题 接口调用优化方法
现在很多软件都会使用应用性能监控,希望可以试试监控软件的性能情况,以便做出优化方案。而在应用性能监控系统中有很多数据,其中也包括接口调用的情况。而接口调用就是指某个子服务系统去调用其他系统。在这个过程中,可能会出现一些问题。大家有疑问的话,可以了解下面的应用性能监控接口调用问题和解决方案。
用户8715145
2022/03/23
1.1K0
通过策略模式提供通用的http接口调用方法
在微服务中,服务可能是部署和运行在不同的区域的。 不同区域的服务,认证方式也不同,接口调用方式不同。
Antony
2020/12/02
1.1K0
Android通过jni调用本地c/c++接口方法总结
网上这方面介绍的文章有很多,但都较凌乱或者不够系统,啰里啰唆一大堆前戏,不如实战来的快。长篇大论真没必要,我们只想上手用,先用起来再说,其他需要了再深入。为了做到通俗易懂和尽可能的简单,直接举例说明吧。举一个详细的例子从头到尾完整实现一遍,保证看一遍就会上手会用。
杨永贞
2022/11/21
2.5K0
Android通过jni调用本地c/c++接口方法总结
vue 接口调用返回的数据未渲染问题
https://cn.vuejs.org/v2/guide/reactivity.html#%E5%A6%82%E4%BD%95%E8%BF%BD%E8%B8%AA%E5%8F%98%E5%8C%96
用针戳左手中指指头
2021/01/29
4.2K0
vue 接口调用返回的数据未渲染问题
MyBaits —— 通过调用接口映射sql语句
1、编写mapper接口 public interface EmployeeMapper { public Employee getEmpById(Integer id); } 2、编写sql
桑鱼
2020/03/18
5600
thinkphp模版调用函数方法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112982.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/08
4980
EasyGBS如何通过接口调用录像计划?
大家知道,我们的流媒体服务器一直都配备了比较全的接口文档,EasyGBS、EasyNVR等都有丰富的接口,能够让有需要的用户便捷进行接口调用,大家可以在官网直接进行下载。最近有些用户希望通过接口去调用EasyGBS录像计划,本文额介绍下如何通过接口去控制EasyGBS录像计划。
TSINGSEE青犀视频
2021/11/09
4360
『开发技术』Python通过字符串调用函数(getattr方法)
笔者看法,字符串相较于函数更容易传递,比如我们可以轻松地通过命令行参数或者常量在不同脚本中传递。
小宋是呢
2022/03/07
1.3K0
python通过字符串调用方法_python调用shell脚本
代码中借鉴了https://blog.csdn.net/weixin_43936250/article/details/105543266的sm3加密,和https://blog.csdn.net/jerry_liufeng/article/details/109603462的目录实时监控
全栈程序员站长
2022/10/01
5120
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
函数的不同使用场合,this有不同的值。 总的来说,this就是函数运行时所在的环境对象。 下面分情况,详细讨论
JavaEdge
2018/08/02
2.8K0
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
匿名函数调用方法_javascript匿名函数
没错,匿名函数简单来说就是普通函数去掉名字,但是他不能单独定义与使用,下面是匿名函数的一些使用场景:
全栈程序员站长
2022/11/14
1.6K0
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
调用 jclass GetObjectClass(jobject obj) 或 jclass FindClass(const char* name) 方法 , 获取 jclass 类型变量 ;
韩曙亮
2023/03/27
8.7K0
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
js中通过ajax调用网上接口
<meta name="viewport" content="width=device-width, initial-scale=1.0">
马克社区
2022/04/19
8.4K0
定义一个接口,外部通过调用接口的方法来生产消息
定义一个接口,外部通过调用接口的方法来生产消息,再放几个常量在里面后面会用到: package com.bolingcavalry.service; public interface LowLevelOperateService { /** * 消费者数量 */ int CONSUMER_NUM = 3; /** * 环形缓冲区大小 */ int BUFFER_SIZE = 16; /** * 发布一个事件
用户8671053
2021/09/26
4190
typecho常用函数及调用方法
24.获取最新评论列表第二个版本,只显示访客评论不显示博主也就是作者或者说自己发的评论
kenvie
2022/01/20
1.7K0
如何通过反射调用对象的方法?
import java.lang.reflect.Method; class MethodInvokeTest { public static void main(String[] args) throws Exception { String str = "hello"; Method m = str.getClass().getMethod("toUpperCase"); System.out.println(m.invoke(str));
唐怀瑟
2018/08/30
2.9K0
调用函数时,关于传参那些事~
                                                                         
The sky
2023/04/12
1.4K0
调用函数时,关于传参那些事~
金税盘组件接口调用方法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131669.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/12
4970
Java通过反射获取类调用方法
Java通过反射获取类调用方法 示例 ReflectUtil.java 模块一 Gjc.java 模块二 UiUtil.java DialogManager.java 在不同模块之间,需要使用其他模块的方法,这个时候就需要用到反射了 示例 模块一操作模块二,即模块一调用模块二中的方法 ReflectUtil.java /** * 反射工具类 */ public class ReflectUtil { public static Class getClass(String name) {
是阿超
2022/08/07
1.9K0
点击加载更多

相似问题

通过COM接口调用JavaScript方法

12

初学者学习程序集保留,尤指函数调用后

20

如何通过COM接口调用C#方法传递函数指针

11

片段接口方法未调用

20

nHibernate (w/ ActiveRecord)与C#接口(尤指DTO接口)

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档