vfp9 如何开发多线程com 给其他语言做接口

jack_wang0823 2017-03-10 04:50:51
vfp9 如何开发多线程com 给其他语言做接口 有没有资料可以参考
...全文
1302 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
jack_wang0823 2017-03-17
  • 打赏
  • 举报
回复
引用 22 楼 taohua300 的回复:
总起来说,给其他语言用的dll与平时的书写习惯有那么一点不同。并且如果数据类型不对应,最终可能也会导致错误。
vfp 类定义中私有属性 和保护属性 使用 PROTECTED或者 HIDDEN 没有关键字代表public 多谢费心指点 我再 试一下别的途径
jack_wang0823 2017-03-16
  • 打赏
  • 举报
回复
引用 18 楼 dkfdtf 的回复:
找个第三方的 COM,先确定不是调用方 权限 或 语法 的问题 或到 jave 或 php 板块去问问,关于调用自己开发的 COM 对象方法有哪些要求
系统调用方面和权限方面应该没问题 , 因为 原来有个DLL 文件调用是正常工作的, 这个DLL 文件是一个设备的驱动. 按照供应商提供的 api 开发接口文件 正常工作, 现在的情况是, 安装了新设备 这个新设备在旧的 dll 文件下工作有些功能工作不正常, 所以供应商提供了新的 DLL 文件. 但是这个dll文件在脚本模式下 根本无法建立对象, 但是在VFP 下工作所有都正常, 厂房拒绝提供源代码. 所以只能用vfp做个COM 再包一层 ...
都市夜猫 2017-03-16
  • 打赏
  • 举报
回复
另外, taohua 的写法没问题,是你在 vfp 中调用时写法有错,最后多个一个逗号,也就是还传入了第三个参数,没指明值的话就是 .F. 网页中要创建 COM 对象,比本地应用安全性上要严格得多,网页是远程调用,任何用户(匿名用户)都可以打开你的网页,这涉及到 DCOM / COM+ / MTS 概念,这都需要做安全性配置,只不过很多是在安装程序中就配置好了
都市夜猫 2017-03-16
  • 打赏
  • 举报
回复
找个第三方的 COM,先确定不是调用方 权限 或 语法 的问题 或到 jave 或 php 板块去问问,关于调用自己开发的 COM 对象方法有哪些要求
jack_wang0823 2017-03-16
  • 打赏
  • 举报
回复
是否能将您编译好的COM 在javascript 中测试一下 看看是否是引用方本身的问题
jack_wang0823 2017-03-16
  • 打赏
  • 举报
回复
引用 15 楼 taohua300 的回复:

多谢指点,

安装你的写法 vfp 能够正常编译通过 但是在 vfp中建立对象 运行时会出现以下错误
vfp 源码

错误提示


在 javascript 和 php 中的出错提示 依然一样 无法建立对象
taohua300 2017-03-16
  • 打赏
  • 举报
回复
总起来说,给其他语言用的dll与平时的书写习惯有那么一点不同。并且如果数据类型不对应,最终可能也会导致错误。
taohua300 2017-03-16
  • 打赏
  • 举报
回复
php,java只是接触过,不会用了,做不了测试,不好意思。 vfp中变量不需要声明就能使用,这将导致vfp的dll在其他环境中使用或许会出现这样或那样的问题。如果遵照变量先声明后使用,还是会出现这样或那样的问题。起码函数重载就不个不大不小的问题。 既然是设备驱动,用vfp封装一遍相对比其他语言要困难一些,不包括我不知道的语言。 或许真正的“vfp.net”就要来了,到时候用起来不知道什么感觉,有兴趣的可以了解一下x#
十豆三 2017-03-15
  • 打赏
  • 举报
回复
xilaianzxsc 2017-03-15
  • 打赏
  • 举报
回复
学习了. 真是佩服老师的能力
taohua300 2017-03-15
  • 打赏
  • 举报
回复
taohua300 2017-03-15
  • 打赏
  • 举报
回复
可能是跟方法是书写方式有关吧,至少我在类似的测试发现有些不同
下面这样些,然后在c#中调用
是可以的

如果下面这样两种写法,会提示错误

都市夜猫 2017-03-15
  • 打赏
  • 举报
回复
先确定是否权限的问题,通常 COM 组件是禁止 guest 用户访问的
jack_wang0823 2017-03-15
  • 打赏
  • 举报
回复
引用 9 楼 dkfdtf 的回复:
我贴的截图是使用 OleViewer 的显示图
你要用 vfp 自带的工具查看组件结构的话,应该用对象浏览器,而不是类浏览器



编译后的dll 应该没什么问题

在javascript的表现是
<script type="text/javascript">
function ss_jc_jc(){
//开始先设置3个变量 用来装3个字段
var add1= document.getElementById("A1");
alert(add1.saygood());

}
</script>
</head>

<body>
<OBJECT ID="A1"
CLASSID="CLSID:CAD0531F-01FD-4420-8408-55A6D0E4FA08">
</OBJECT>

<input type="button" onclick="javascript :ss_jc_jc();" value="tttt"/>
</body>
</html>


在php的表现是

<?php
header("Content-Type: text/html; charset=utf-8");

$aa= new COM("zkemvfp.zkem") or die("Unable to instanciate Word");


?>

Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `zkemvfp.zkem' in D:\wamp\www\testckvfp.php on line 4

jack_wang0823 2017-03-14
  • 打赏
  • 举报
回复
我安装的版本是
jack_wang0823 2017-03-14
  • 打赏
  • 举报
回复
引用 5 楼 dkfdtf 的回复:
[quote=引用 4 楼 jack_wang0823 的回复:]
查了一些资料 , 好像COM 组件开发中需要预定义很多 接口的, 像这样简单的 定义,也只有 VFP 能认出来了 不知道有哪些接口规范 可以参考

但是给其他程序调用 就不行了 , 总提示 对象建立失败.
...
查了一些资料 , 好像COM 组件开发中需要预定义很多 接口的, 像这样简单的 定义,也只有 VFP 能认出来了 不知道有哪些接口规范 可以参考

怎么会不行,只要编译成 dll 后其他语言就同样可以用 CreateObject 创建实例
如果是在其它人的机器上,先用 RegSvr32 注册
至于 COM 接口,vfp 编译时会自动创建,就编译你那几行代码,创建出的 dll 就会存在下列标准接口
[/quote]

我可能装了一个假的VFP 我编译出来的 dll 看起来是这样的

都市夜猫 2017-03-14
  • 打赏
  • 举报
回复
引用 4 楼 jack_wang0823 的回复:
查了一些资料 , 好像COM 组件开发中需要预定义很多 接口的, 像这样简单的 定义,也只有 VFP 能认出来了 不知道有哪些接口规范 可以参考
...
但是给其他程序调用 就不行了 , 总提示 对象建立失败.
...
查了一些资料 , 好像COM 组件开发中需要预定义很多 接口的, 像这样简单的 定义,也只有 VFP 能认出来了 不知道有哪些接口规范 可以参考

怎么会不行,只要编译成 dll 后其他语言就同样可以用 CreateObject 创建实例
如果是在其它人的机器上,先用 RegSvr32 注册
至于 COM 接口,vfp 编译时会自动创建,就编译你那几行代码,创建出的 dll 就会存在下列标准接口
jack_wang0823 2017-03-14
  • 打赏
  • 举报
回复
引用 3 楼 firstxinjie 的回复:
[quote=引用 楼主 jack_wang0823 的回复:] vfp9 如何开发多线程com 给其他语言做接口 有没有资料可以参考
VFP可以编译出标准的多线程COM,其使用方法和其他语言所做的,应该没什么差别。 二楼的回复是VFP中实现多线程的一些资料,和多线程COM无关。[/quote] 多谢指点 , 网上搜集了一些资料, 依葫芦画瓢 , 编译出了测试用的 DLL文件,, 现在 的问题时 , 这个dll 在vfp 里面用 CREATEOBJECT("文件名.类名的")的方式调用 没有任何问题 , 但是给其他程序调用 就不行了 , 总提示 对象建立失败.


Define Class testc As Session OLEPUBLIC


Procedure saygood
		Parameters  msg
		Return  msg
Endproc

Enddefine
查了一些资料 , 好像COM 组件开发中需要预定义很多 接口的, 像这样简单的 定义,也只有 VFP 能认出来了 不知道有哪些接口规范 可以参考
都市夜猫 2017-03-14
  • 打赏
  • 举报
回复
我贴的截图是使用 OleViewer 的显示图
你要用 vfp 自带的工具查看组件结构的话,应该用对象浏览器,而不是类浏览器

xilaianzxsc 2017-03-14
  • 打赏
  • 举报
回复
同样学习了.
加载更多回复(3)
POSTGRESQL 让客户端互相通信

在客户端/服务器的工作模式下,客户机处于主动状态,发送请求给监听状态的服务器,后者处理后再将结果返回给客户机。
在这种工作模式下,客户端只与服务端联系,因为它不处于监听状态,所以无法收到服务端或其他客户端“不请自来”的信息。这导致一个现象发生:当某个客户端修改了服务端的数据后,其他客户端不能实时获知,以至这些客户端所获取的数据过时。目前解决的主要方法是客户端周期性向服务器端获取数据,即使这些数据并没有变动。这导致两端都浪费了资源。

POSTGRESQL能较好地解决这个问题。POSTGRESQL是个开源数据库,功能齐全,性能优异,其好处这里不多描述,大家可以去(http://www.postgresql.org)了解.

POSTGRESQL有两个SQL语句 LISTEN和NOTIFY。
LISTEN NAME 让当前连接处于监听状态,监听名为NAME的NOTIFY的到来。
NOTIFY NAME 发送名为NAME的NOTIFY事件给之前已经LISTEN NAME的所有客户端,

NOTIFY事件格式含有NAME和PID两项,LISTEN方可以根据PID项获知是哪个进程发送。举个例子:所有客户端想及时了解表AAA更改事件,于是它们就发送LISTEN AAA命令监听该事件的发生(取AAA名,只是直观点,主要看大家的约定)。当某一个客户端修改了表AAA,就发送NOTIFY AAA命令,于是所有客户端就收到了这个通知,知道表AAA已经被别人修改。

LISTEN/NOTIFY具体应用请看POSTGRESQL文档。

俗话,好马还要好鞍。既然数据库有如此好的功能,若接口不支持,也是白搭。POSTGRESQL的各种接口目前只有C接口libpq.dll和JAVA接口JDBC有封装这功能,其余接口如ODBC,OLEDB等都没封装,原因是,不当当是接口要封装了此功能,同时客户应用程序要有监听机制,才可以收到这些“不请自来的”的通知。C和JAVA可以设计成多线程,让某个线程阻塞IO进行监听,另一线程可以正常工作,是不会影响应用的运行的。而其他用ODBC接口C的应有程序如PB、VFP等,很难设计成多线程,所以这些接口封装LISTEN/NOTIFY也没有多大意义。

既然应有程序不是多线程,但WINDOWS操作系统是多线程,是否可将这些“不请自来的”的通知转化为WINDOWS的消息流呢?而大部分应用程序是可以处理自定义消息的。答案是可以的,这是我在ODBC封装NOTIFY/LISTEN的思路。在ODBC中非调用时间执行WSAAsyncSelect,当一个“不请自来的”通知(其实网络包)到达时,会将网络事件转化为消息,应用程序可以设计MESSAGE_HANDLE来处理这些消息。

我把PSQLODBC8.01.02版本的源程序稍微修改后,重新编译,使ODBC封装了此功能。经测试,在各种开发语言是可以成功运行的。具体的使用方法请参照压缩包里的“说明”文挡和例子。


2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧