关于VBA中调用vc作成的dll函数的可以返回值的参数传递的问题 (急!! 多谢多谢)

daive07 2003-10-16 09:02:05
我用vc作成了一个dll函数. 定义如下:
extern "C" void __declspec(dllexport) SourceMake(LPARAM asHandleType1, VARIANT &p){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
p.vt = VT_BSTR;
p.bstrVal=SysAllocString(L"MyNewContainer");

}

然后用vba调用
Private Declare Sub SourceMake Lib "SourceMake.dll" (str As Any, src As
Variant)

Private Sub Command1_Click()
Dim src As Variant
Dim str As String
str = "100000"

Dim b() As Byte
b = StrConv(str, vbFromUnicode)
ReDim Preserve b(UBound(b) + 1)

b(UBound(b)) = 0

On Error GoTo EX

src = String(255, vbNullChar)

Call SourceMake(b(0), src )
MsgBox src

EX:
MsgBox Err.Description

End Sub



我的用意是str 只是作为传入参数(这个没用问题),src 能够将dll函数中处理后的子符串
串回来.
但实际使用中,执行后会出现"bad dll calling convention" 或 windows异常的错误.

我试了好多种类型,都不能传回值.我觉得应该是类型匹配的问题.
但实在不知如何解决, 特此向各位高手请教.
多谢多谢.
...全文
184 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
DuMiYue 2003-10-17
  • 打赏
  • 举报
回复
其实不用那么复杂,可以这样写:
给你个例子~~
extern "C" int _stdcall GetTagInfoString(LPCTSTR strRMsg,/*[in]*/
short *intCarrierClass,/*[out]*/
BSTR* strCargo/*[out]*/)


VB:
Public Declare Function GetTagInfoString Lib "CargoDLL.dll" _
(ByVal strRMsg As String, intCarrierClass As Integer, strCargo As String) As Long

调用后记得用StrConv(strCargo, vbFromUnicode)。。
DuMiYue 2003-10-17
  • 打赏
  • 举报
回复
extern "C" void __declspec(dllexport) SourceMake(LPARAM asHandleType1, VARIANT &p){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
p.vt = VT_BSTR;
p.bstrVal=SysAllocString(L"MyNewContainer");

}
改为
extern "C" void __stdcall SourceMake(LPARAM asHandleType1, VARIANT &p){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
p.vt = VT_BSTR;
p.bstrVal=SysAllocString(L"MyNewContainer");

}

然后添加一个.DEF文件,在该文件中导出它
daive07 2003-10-17
  • 打赏
  • 举报
回复
对DuMiYue(三少) 的回答深表感谢.
那为什么标准的__declspec(dllexport)申明不行呢?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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