VC中如何生成可以被vb或pb调用的外部函数

qiyousyc 2004-11-15 04:14:52
如题
...全文
172 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
himaernew 2004-11-18
  • 打赏
  • 举报
回复
EXPORTS foo3 = _foo3@12

==>EXPORTS foo3 @12

他原来的是这么写的,但应该是“EXPORTS foo3 @12 ”
zephyr518 2004-11-16
  • 打赏
  • 举报
回复
加入STDCALL关键字
招财猫_Martin 2004-11-16
  • 打赏
  • 举报
回复
1、
extern "C"
functype WINAPI funcname(vartype var1, vartype var 2, ...);

然后在.DEF文件的EXPORT下导出该函数

2、
extern "C"
functyep __declspec(dllexport) __stdcall funcname(vartype var1, vartype var2, ...)
forswear 2004-11-16
  • 打赏
  • 举报
回复
mark
qiyousyc 2004-11-16
  • 打赏
  • 举报
回复
EXPORTS foo3 = _foo3@12
= _foo3@12 是干什么的?
himaernew 2004-11-15
  • 打赏
  • 举报
回复
In PowerBuilder

Note: the name of the function used in the declaration section should be the same as exported function name. If the .DEF file was not included within the .DLL, the function will be exported decorated and has to be prototyped decorated as well.
If you are using some third party DLLs and rae not sure how the function you are calling is exported, you can use Exported Function section of Quick View.

//Prototype function call in Local or Global External Functions Declaration section:
FUNCTION Long foo3( long arg1, long arg2, long arg3)Library"d:\API CALLS\first.dll"
himaernew 2004-11-15
  • 打赏
  • 举报
回复
呵, oyljerry(☆勇敢的心☆-要开始写论文了) 写的正确。一定要注意调用约定!
不用MFC的我倒是刚做过,不过我建议你参考SYBASE网站一的一篇文章,我刚开始用VC写的在PB下调用老是死机,看完后就好了。不过忘了具体网址了.名称是“如何用VC创建可在PB中调用的DLL”:
我贴一下主要内容, 这是个例子:

Writing a source code
.C or .CPP file

#include <windows.h>
#include "first.h"

long __declspec(dllexport) __stdcall foo3(long mylong1, long mylong2,long mylong3)
{
long calc;
calc = (mylong1 + mylong2 + mylong3);
return(calc);
};

Header File
//Includes functions declarations, variables and structures declaration and //initialization.

long __declspec(dllexport) __stdcall foo3(long mylong1, long
mylong2,long mylong3);

.Def file

//"Undecorates " functions names decorated by __stdcall

LIBRARY first.dll
EXPORTS foo3 = _foo3@12
ayanamiwww 2004-11-15
  • 打赏
  • 举报
回复
对,DLL或者控件都可以,pb没试过用控件,照理说应该没问题。
oyljerry 2004-11-15
  • 打赏
  • 举报
回复
建立dll,导出函数,注意函数调用约定,就可以给pb,vb调用了
spring_cj 2004-11-15
  • 打赏
  • 举报
回复
这还麻烦啊?我所知的最简便的方法
qiyousyc 2004-11-15
  • 打赏
  • 举报
回复
1楼的太麻烦,我记得有比1楼的简单的,不用MFC AppWizard DLL创建的
spring_cj 2004-11-15
  • 打赏
  • 举报
回复
1)动态连接库的建立
VC++6.0中可以用MFC AppWizard自动生成Win32 DLL和MFC AppWizard DLL,启动VC之后,从File | New菜单项,选择New对话框中的Projects标签,选择新项目为MFC AppWizard( dll ) ,输入工程名Smsdll,点击OK按钮,在弹出的对话框中选择DLL类型为:Regular DLL using shared MFC DLL,然后点击Finish按钮。这样,AppWizard将自动创建一个包含基本要素的DLL框架。
(2)程序代码编写
打开Smsdll.cpp文件或自己创建一个文件( 如:user.cpp,并且将user.cpp添加到工程中 ) ,在文件中编写短信处理程序。限于篇幅,仅列出UCS2编码的源代码。
UCS2编码源程序

extern "C" _declspec ( dllexport ) int WINAPI EnCodeUcs2(const char * lpszSend,char * lpszUnicode,int lSrcLen){
int unLen= MultiByteToWideChar(CP_ACP,0, lpszSend, lSrcLen, NULL, 0);
try{
LPWSTR pUnMessage=new WCHAR[unLen];
if(!MultiByteToWideChar(CP_ACP,0,lpszSend,lSrcLen,pUnMessage,unLen)){
return -1;
}
for(int i=0;i<unLen;i++){
sprintf((lpszUnicode+4*i),"%04X",*pUnMessage);
pUnMessage++;
}
}
catch(...){
return -1;
}
return 4*unLen;
}
以上声明了函数EnCodeUcs2,在要输出的函数、类、数据的声明前加上_declspec(dllexport)的修饰符,表示输出;extern "C"用来指明该函数使用C编译方式,输出的“C”函数可以从“C”代码里调用,如果没有extern “C”修饰,输出函数仅仅能从C++代码中调用。
(3)输出函数的引出方法
打开Smsdll.def文件,在EXPORTS下输入函数说明,文件内容如下:
Smsdll.def文件内容

LIBRARY "SMSDLL"
DESCRIPTION 'SMSDLL Windows Dynamic Link Library'
EXPORTS
; Explicit exports can go here
EnCode7Bit @1 ;7-bit编码
DeCode7Bit @2 ;7-bit解码
EnCodeUcs2 @3 ;Ucs2编码
DeCodeUcs2 @4 ;Ucs2解码
GetSmsList @5 ;解析数据得到短信内容
GetAddressList @6 ;解析数据得到电话簿内容
GetAddressCount @7 ;解析数据得到电话簿容量
GetSmsCenter @8 ;解析数据得到短信中心号码
FormatPdu @9 ;格式化发送短信的内容
模块定义文件(.DEF)是一个或多个用于描述DLL属性的模块语句组成的文本文件,每个DEF文件至少必须包含以下模块定义语句:
n 第一个语句必须是LIBRARY语句,指出DLL的名字;
n EXPORTS语句列出被导出函数的名字,将要输出的函数修饰名罗列在EXPORTS之下,这个名字必须与定义函数的名字完全一致。
同时可以使用DESCRIPTION语句描述DLL的用途。
(4)动态连接库的调用
Windows将遵循下面的搜索顺序来定位DLL:
1.包含EXE文件的目录;
2.进程的当前工作目录;
3.Windows系统目录;
4.Windows目录;
5.列在Path环境变量中的一系列目录。
以EnCodeUcs2函数为例,要在VB中使用该函数,声明的方法为:
Public Declare Function EnCodeUcs2 Lib "SMSDLL.dll" (ByVal lpszSend As String, ByVal lpszUnicode As String, ByVal srcLen As Long) As Long
在PowerBuilder中声明的方法为:
FUNCTION Long EnCodeUcs2 (String lpszSend,ref String lpszUnicode,Long srcLen) LIBRARY "SMSDLL.dll" 。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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