请教:关于外部程序调用dll的问题.谢谢!!!

rjcludy 2001-11-16 05:54:36
用vc 写一个函数
1 export出来的函数f_export的定义为
extern "C" __declspec(dllexport) int f_export(LPCTSTR data,LPCTSTR result)
其中data是输入的值,result是要返回的值
在f_export中调用一函数f_inside
调用代码为:
result=(LPCTSTR)f_inside((unsigned char*)data);
2 f_inside的定义为:
unsigned char* f_inside(unsigned char* data);

这样编译后 用pb调用会出现错误(大概错误信息为:堆栈指针无效 等)

可以肯定pb调用是正确的,
要是不修改函数f_inside(由于相关牵连太多)有什么办法处理???

不管后天是否得到答案都结帐

...全文
221 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamxia 2001-11-19
  • 打赏
  • 举报
回复
g z
rjcludy 2001-11-18
  • 打赏
  • 举报
回复
结账,谢谢几位大哥
rjcludy 2001-11-18
  • 打赏
  • 举报
回复
to gboy
谢谢你
我试了一下把 LPCTSTR result当成函数的返回值还是不行(这样就一个参数了)

最后up一下
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
up 一下
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
up 一下
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
谢谢你 daliusky

pb中可以定义应用来处理vc中的指针
(调用window api的指针类型都可以)
现在主要是dll中的指针要用长指针
由于dll的函数f_inside()是unsigned char *类型
用lpcstr转化可能不行

我的想法是在f_export中定义一个变量unsigned char *b
b=f_inside()
再把复制给LPCTSTR result
可惜我不会处理
不知道这样行不行???
要是可以,把我写一下复制给result的代码

谢谢!!!!!!!
gbstar2021 2001-11-17
  • 打赏
  • 举报
回复
to rjcludy

你说的那个我也不太确定,不过如果只有一个参数的,函数的调用规则就不起作用了

这是说的调用规则是指函数参数进栈的顺序(左-〉右 or 右-〉左)
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
回去了,明天再来看,
再次谢谢alphagx(alpha), dalinsky(大林) , gboy(boy) , DoItFreely(Freely)等几位
大侠的帮助
谢谢
(麻烦几位大侠到贴子http://www.csdn.net/expert/topic/375/375258.shtm中随便跟贴一个
,明天我好结账,我知道你们不会在意一点分数,但要是没人回贴我就没法结账了,同时我的一点心意)
再次谢谢几位大侠
!!!!!!!!!!!!!!!大家周末愉快!!!!!!!!!!!!!!!!!
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
to alphagx
代码已发过去
麻烦你看一下dll代码谢谢。
调用该dll的pb代码是:

pb中是这么定义的
function int Encrypt(ref string a,ref string b) library "encryption.dll";

调用时:
string a,b
a = 'abcdefg'
b = space(100) //说明:分配空间
Encrypt(a,b)
messagebox(a,b)

//因为pb编译的程序要用pb带的pbvm.dll等解释施行,pbvm.dll等有好几兆,
//所以我这里就先给pb调用的代码,要是需要的话我再把pb的源代码和编译好的程序一起发给你
//谢谢你

再次谢谢你
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
to gboy(boy)

假如我在dll中定义
extern "C" ENCRYPTION_API int test(char data)
{
return 101;

}
那么pb就调用正常阿

除了字符串外(vc中只有指针才能与pb的字符串对应)其他类型没有问题
其实我的dll只是为了把一个字符串加密后,把密文传出来
不知道window的api中什么处理LPCTSTR
我用同样的方法可以调用window api中的lpctstr类型(不管是传出还是传入)
pb没法debug到dll中
而VC我又不熟练

alphagx 2001-11-17
  • 打赏
  • 举报
回复
OK
gx_sz@163.com
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
113B264F mov eax,dword ptr [esi+10h]
113B2652 push ebx
113B2653 push eax
113B2654 mov dword ptr [esp+34h],edi
113B2658 call 112ACB10
113B265D test edi,edi
113B265F mov ebx,dword ptr [esp+34h]
113B2663 jne 113B267A
113B2665 push ebx
113B2666 push 503Eh
113B266B push esi
113B266C call 113BE4F0 到这一步出错

要不我把原程序发给你,你帮我看看好吗????
谢谢你 alphagx(alpha) 
gbstar2021 2001-11-17
  • 打赏
  • 举报
回复
函数调用规则不对
最好这样
int WINAPI Encrypt(LPCTSTR data,LPCTSTR result)
{
}


然后在 def 文件中,写明导出函数
alphagx 2001-11-17
  • 打赏
  • 举报
回复
其实你的代码就是:
extern "C" ENCRYPTION_API int Encrypt(LPCTSTR data,LPCTSTR result)
{
CDES des;
result=(LPCTSTR)des.EncryptData((unsigned char*)data);
}

你在result=(LPCTSTR)des.EncryptData((unsigned char*)data);设断点,
然后进行DEBUG, 这时候与调试普通程序是一样的。
你看看指针是不是有效, 看到底哪一步出错了。


rjcludy 2001-11-17
  • 打赏
  • 举报
回复
to alphagx

先谢谢你
调试出现的信息为:
--- D:\work\c\encryption\encryption.cpp -------------------------------------------------------
278:
279: extern "C" ENCRYPTION_API int Encrypt(LPCTSTR data,LPCTSTR result)
280: {
024025D0 push ebp
024025D1 mov ebp,esp
024025D3 mov eax,1398h
024025D8 call $$$00001 (02402ab0)
024025DD push ebx
024025DE push esi
024025DF push edi
024025E0 lea edi,[ebp-1398h]
024025E6 mov ecx,4E6h
024025EB mov eax,0CCCCCCCCh
024025F0 rep stos dword ptr [edi]
281: CDES des;
024025F2 lea ecx,[ebp-1358h]
024025F8 call @ILT+75(CDES::CDES) (02401050)
282: // strcpy(result,des.EncryptData((unsigned char*)data));
283: result=(LPCTSTR)des.EncryptData((unsigned char*)data);
024025FD mov eax,dword ptr [ebp+8]
02402600 push eax
02402601 lea ecx,[ebp-1358h]
02402607 call @ILT+90(CDES::EncryptData) (0240105f)
0240260C mov dword ptr [ebp+0Ch],eax
284: return 0;
0240260F xor eax,eax
285: }
02402611 pop edi
02402612 pop esi
02402613 pop ebx
02402614 add esp,1398h
0240261A cmp ebp,esp
0240261C call __chkesp (02402920)
02402621 mov esp,ebp
02402623 pop ebp
02402624 ret

看不懂
能不能帮我讲解一下
谢谢
alphagx 2001-11-17
  • 打赏
  • 举报
回复
你会不会把PB的程序编译成EXE文件,
然后你可以调试DLL了。

你在定义函数时定义为_stdcall就 是标准的DLL了
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
to alphagx(alpha) 
我公司上不了qq

谢谢!!!
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
to alphagx
"在C++中extern后不要加 "C"
那是为了让C++中调用C中的函数。"
我不明白???
c++中要是导出的函数不加extern "C",就不是标准的dll吧,那pb肯定调用不了

(我vc比较菜,请不要介意,麻烦详细点,thanks)
alphagx 2001-11-17
  • 打赏
  • 举报
回复
你告诉我QQ,我的QQ14278012
rjcludy 2001-11-17
  • 打赏
  • 举报
回复
to alphagx
result的空间在pb中有分配

to doitfreely
用strcpy代替后编译不通过出现错误(strcpy那一行出错)
错误信息:
D:\test.cpp(282) : error C2664: 'strcpy' : cannot convert parameter 1 from 'const char *' to 'char *'

谢谢!!两位大哥
还有其他方法吗???????????/

thank u very much

加载更多回复(7)

16,472

社区成员

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

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

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