如何在ABAP程序中从客户端调用DLL函数

2020-08-20 20:22发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


这不是很普通,但是使用ABAP语言进行DLL调用非常容易。 Yuri Popov编写了一个名为DynamicWrapperX的模块。 它是一个ActiveX组件,它允许通过COM调用所需的DLL中的每个函数。 很棒的模块,您可以在此处找到模块。

必须先使用事务代码SOLE在SAP系统中注册OLE应用程序DynamicWrapperX。 输入:

  • OLE应用程序:DynamicWrapperX
  • CLSID:{89565275-A714-4a43-912E-978B935EDCCC}
  • CLSID类型库:{89565275-A714-4a43-912E-978B935EDCCC}
  • OLE对象名称:DynamicWrapperX
  • 语言:EN
  • 文本:组件允许调用DLL导出的函数

而且有必要使用regsvr32.exe dynwrapx.dll在客户端系统上注册DynamicWrapperX。

请看以下示例,使用USER32.DLL中的Windows函数有多么容易:

包括OLE2INCL。

 资料:IDY是TYPE I VALUE 6,
       IDNo类型i值7。

 数据:Win32 TYPE OLE2_OBJECT,
       退出TYPEI。

 创建对象Win32'DynamicWrapperX'。

 Win32"注册"的调用方法
   出口
     #1 ='user32.dll'
     #2 ='MessageBoxW'
     #3 ='i = hwwu'
     #4 ='r = l'。

 Win32的调用方法'MessageBoxW'= ret
   出口
     #1 = 0
     #2 =" Hello World"
     #3 ='测试'#4 = 4。

   如果ret = IDYes。
     写" Ja"。
   ELSEIF ret = ID号。
     写" Nein"。
   其他。
     写'?'。
   万一。

   免费对象Win32。

重要提示:该方法仅适用于前台作业和在线流程,不适用于后台作业和批处理流程。

享受各种可能性。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


这不是很普通,但是使用ABAP语言进行DLL调用非常容易。 Yuri Popov编写了一个名为DynamicWrapperX的模块。 它是一个ActiveX组件,它允许通过COM调用所需的DLL中的每个函数。 很棒的模块,您可以在此处找到模块。

必须先使用事务代码SOLE在SAP系统中注册OLE应用程序DynamicWrapperX。 输入:

  • OLE应用程序:DynamicWrapperX
  • CLSID:{89565275-A714-4a43-912E-978B935EDCCC}
  • CLSID类型库:{89565275-A714-4a43-912E-978B935EDCCC}
  • OLE对象名称:DynamicWrapperX
  • 语言:EN
  • 文本:组件允许调用DLL导出的函数

而且有必要使用regsvr32.exe dynwrapx.dll在客户端系统上注册DynamicWrapperX。

请看以下示例,使用USER32.DLL中的Windows函数有多么容易:

包括OLE2INCL。

 资料:IDY是TYPE I VALUE 6,
       IDNo类型i值7。

 数据:Win32 TYPE OLE2_OBJECT,
       退出TYPEI。

 创建对象Win32'DynamicWrapperX'。

 Win32"注册"的调用方法
   出口
     #1 ='user32.dll'
     #2 ='MessageBoxW'
     #3 ='i = hwwu'
     #4 ='r = l'。

 Win32的调用方法'MessageBoxW'= ret
   出口
     #1 = 0
     #2 =" Hello World"
     #3 ='测试'#4 = 4。

   如果ret = IDYes。
     写" Ja"。
   ELSEIF ret = ID号。
     写" Nein"。
   其他。
     写'?'。
   万一。

   免费对象Win32。

重要提示:该方法仅适用于前台作业和在线流程,不适用于后台作业和批处理流程。

享受各种可能性。

付费偷看设置
发送
7条回答
DafaDDDa
1楼-- · 2020-08-20 20:49

感谢分享,请在SDN Wiki的ABAP部分中创建一个包含此信息的条目。

Thomas

bbpeas
2楼-- · 2020-08-20 20:58

好吧……

非常感谢您的关注和帮助。

尽管它是ActivX类型的,但是它不起作用。 也许," dll"的作者创建了它

不正确。

我将其留作以后使用。

欢呼

Sergei

蓋茨
3楼-- · 2020-08-20 20:45

非常感谢!

当方法必须返回值时,您可以显示示例吗?

例如:我需要使用一些AddInISC.dll。

在我们的项目中VB可以像这样工作:

设置DX = CreateObject(" DynamicWrapperX")

DX。注册" AddInISC.dll"," CalcRic"

_value = DX.CalcRic(" MANYSYMBOLS",0)

现在_value具有数据。

如何在ABAP中使用此示例?

我尝试在您的示例中使用,但是...我不知道我在哪里犯错。

创建对象Win32'DynamicWrapperX'。

Win32的调用方法'注册'
导出
#1 ='C:\ WINDOWS \ system \ AddInISC.dll'#2 ='CalcRic'。

Win32的调用方法' CalcRic'
EXPORTING
#1 ='MANYSYMBOLS'#2 = 0.

获取Win32'CalcRic'的属性= cik。


写:cik。 "这里什么也没有。

小c菟菟
4楼-- · 2020-08-20 20:47

Hello Harjyot,

我展开了 COM(P4COM)库的指针。现在还可以在动态链接库中调用函数-不太舒服,但可以使用。

下面是一个示例:

"-开始-------------------------------------------- ---------

程序zPointOfSale。

"-类型池-------------------- ------------------------

类型池OLE2。

"-变量---- -----------------------------------------

数据点 键入OLE2_OBJECT。

数据TerminalID类型字符串值''。

数据ptrTerminalID类型i值0。

数据RetailerID类型字符串值"。

数据ptrRetailerID类型i值0。

数据hDLL类型i值0。

数据变量类型i值0。

数据ret类型i 值为0。

" -Main ------------------------------------- -------------

创建对象Ptr'P4Com'。

如果sy-subrc = 0且Ptr-Handle <> 0且

Ptr-Type ='OLE2'。

"-在内存中创建变量-------- ----------------

Ptr的调用方法'CreateVar'= ptrTerminalID

导出#1 ='TerminalID'#2 =' String'

#3 = 9。

Ptr的调用方法'CreateVar'= ptrRetailerID

导出#1 ='RetailerID'#2 ='String'

#3 = 17。

"-打开库-------------------------- --------

Ptr的调用方法'OpenLibrary'= hDLL

导出#1 ='C:\ Dummy \ POS.dll'。

如果hDLL <> 0和ptrTerminalID <> 0和

ptrRetailerID <> 0。

"-为函数调用创建堆栈---------- --------

Ptr的调用方法'CreateVar'= Vars

导出#1 ='Vars'#2 ='Array'#3 = 8/p>

如果Vars <> 0。

"-将变量压入堆栈-------------------

< > "

"提示:顺序相反,因为它是

" Pascal调用约定

"

"- --------------------------------------------

Ptr'SetArrayLong'的调用方法

导出#1 ='Vars'#2 = 0

#3 = ptrRetailerID。

Ptr的调用方法' SetArrayLong'

导出#1 ='Vars'#2 = 4

#3 = ptrTerminalID。

"-调用库中的函数--- -----------

Ptr的调用方法'CallFunction'= ret

导出#1 = hDLL

#2 =' API_GETTERMINALPARAMS'

#3 = 2#4 =变量。

"-获取结果--------------------- ---------------

Ptr的调用方法'GetStringVar'=终端ID

导出#1 ='TerminalID'。

Ptr'Ge的调用方法 tStringVar'= RetailerID

导出#1 ='RetailerID'。

"-销毁堆栈-------------------- -------------

Ptr的调用方法'DestroyVar'= ret

导出#1 ='Vars'。

EndIf。

"-销毁变量-------------------------------

< p> Ptr的调用方法'DestroyVar'= ret

导出#1 ='RetailerID'。

Ptr的调用方法'DestroyVar'= ret

导出 #1 ='TerminalID'。

"-关闭库-------------------------------

Ptr的调用方法'CloseLibrary'= ret

导出#1 = hDLL。

EndIf。

写入:/TerminalID。

写入:/RetailerID。

免费对象属性。

EndIf。

"-End -------- -----------------------------------------------

干杯

斯特凡

愤怒的猪头君
5楼-- · 2020-08-20 20:58

你好斯特凡,

问候!

需要您的帮助来满足我的一项要求,如下所述。您的任何帮助都将被高尚地申请。

我们有要求从SAP中为POS设备调用DLL函数(销售点,即付款期间的刷卡机)。

此处POS设备具有某些功能(例如api_CheckExistance,api_TriggerTrxTrack2和api_GetTransactionResult以使用POS)。 我们尝试使用您提到的上述方法实施相同的方法,但未成功。 您能告诉我们如何处理POS设备功能,尤其是导入参数吗?

示例:下面的函数需要在SAP中调用

函数名称:

api_GetTerminalParams

功能用法:

可用于从终端的非易失性配置存储器中读取终端标识号和零售商标识号,以用于主机应用程序的内部用途。

它的一种常见用法是使用处理该交易的终端ID标记该交易。

输入参数:

不适用

返回参数:

该函数需要两个参数,这些参数将填充适当的数据。

  1. 1。 szTerminalID:该参数的长度至少应为9个字节,因为终端ID的大小始终为八位,并且库在末尾附加了一个空字符,用于" C"特定的空终止。
  2. 2。 szRetailerID:长度至少应为17个字节,因为零售商ID最多可以包含16个字符,如果零售商ID小于16个字符,则在末尾添加空格以保留16个字节的边界。

C ++中的函数声明:

外部" C"整数FAR PASCAL EXPORT api_GetTerminalParams(char FAR * szTerminalID,char FAR * szRetailerID);

与此文档一起提供的C ++项目源中提供了一个示例C ++代码

代楠1984
6楼-- · 2020-08-20 20:56

尊敬的Stefan

我最终在VBS和ABAP中得到了正确的结果,这是因为应该在Release中编译该dll文件,而在Debug中不编译。 非常感谢您的帮助。 谢谢,非常感谢????

最好的问候

James

一周热门 更多>