一百分提问,不够再加。VC中的LPCSTR在VB调用时传什么类型的参数。

时间:2022-01-28 14:35:56
我现在用VB调用公司自已开发的一个API.函数原型如下。
DllExport int SMPPInitialize(LPCTSTR lpszINIFileName);

我在VB中的声明及调用如下:
Private Declare Function SMPPInitialize Lib "smppdllapi.dll" (Byval IniFileName As String) As Long

 IniFile = "C:\\in.ini"
 iRet = SMPPInitialize(IniFile)

但是出错,出错信息为

Run-time error'49'
Bad Dll calling convention

请问这是什么原因啊?是不是LPCSTR不能用String传。

捎带着还有一个问题:LPCSTR * 应该用VB怎么传参数。谢谢各位。

9 个解决方案

#1


__stdcall

#2


LPCSTR *只能ByVal …… As Long传地址

#3


说的详细点好吗?不是LPCSTR * ,是LPCSTR 这两个有没有区别我不知道,因为我VC不熟,应该是不一样的吧。

#4


__Stdcall
这个问题在我刚用VC的时候就已经碰到了

#5


DllExport int __ stdcall SMPPInitialize(LPCTSTR lpszINIFileName);

#6


在MSDN中有这样的:将 C 语言声明转换为 Visual Basic 声明

C 语言数据类型|在Visual Basic 中声明为   |调用时使用的表达式 
ATOM         |ByVal variable As Integer | 结果为Integer类型的表达式 
BOOL         |ByVal variable As Long    | 结果为 Long 类型的表达式 
BYTE         |ByVal variable As Byte    |结果为 Byte 类型的表达式 
CHAR ByVal   | variable As Byte         |结果为 Byte 类型的表达式 
COLORREF     |ByVal variable As Long    |结果为 Long 类型的表达式 
DWORD        |ByVal variable As Long    |结果为 Long 类型的表达式 
HWND, HDC,
 HMENU 等。
(Windows句柄)| ByVal variable As Long  |结果为 Long 类型的表达式 
INT, UINT     | ByVal variable As Long  |结果为 Long 类型的表达式 
LONG         |ByVal variable As Long    |结果为 Long 类型的表达式 
LPARAM       |ByVal variable As Long    |结果为 Long 类型的表达式 
LPDWORD      |variable As Long          |结果为 Long 类型的表达式 
LPINT, LPUINT|variable As Long          |结果为 Long 类型的表达式 
LPRECT       |variable As type          |自定义类型的任意变量 
LPSTR, LPCSTR| ByVal variable As String |结果为 String 类型的表达式 
LPVOID       |variable As Any           |任何变量(在传递字符串的时候使用 ByVal) 
LPWORD       |variable As Integer       |结果为 Integer 类型的表达式 
LRESULT      |ByVal variable As Long    | 结果为 Long 类型的表达式 
NULL         |As Any 或ByVal variable As|
             |  Long                    |ByVal Nothing
SHORT        |ByVal variable As Integer |结果为 Integer 类型的表达式 
VOID         |Sub procedure             |不可用 
WORD         |ByVal variable As Integer |结果为 Integer 类型的表达式 
WPARAM       |ByVal variable As Long    | 结果为 Long 类型的表达式 

#7


to:
zyl910(910:分儿,我来了!) 
 holydiablo(鱼头) 

我不能改VC的源码,我这里就只有一个Dll.除了在函数定议前加 _stdcall以外还有什么办法啊,只在VB端作改动。

#8


up

#9


再用C写一个中间函数,调用源函数后用_stdcall返回。
只有_stdcall才能跨编程环境调用。

#1


__stdcall

#2


LPCSTR *只能ByVal …… As Long传地址

#3


说的详细点好吗?不是LPCSTR * ,是LPCSTR 这两个有没有区别我不知道,因为我VC不熟,应该是不一样的吧。

#4


__Stdcall
这个问题在我刚用VC的时候就已经碰到了

#5


DllExport int __ stdcall SMPPInitialize(LPCTSTR lpszINIFileName);

#6


在MSDN中有这样的:将 C 语言声明转换为 Visual Basic 声明

C 语言数据类型|在Visual Basic 中声明为   |调用时使用的表达式 
ATOM         |ByVal variable As Integer | 结果为Integer类型的表达式 
BOOL         |ByVal variable As Long    | 结果为 Long 类型的表达式 
BYTE         |ByVal variable As Byte    |结果为 Byte 类型的表达式 
CHAR ByVal   | variable As Byte         |结果为 Byte 类型的表达式 
COLORREF     |ByVal variable As Long    |结果为 Long 类型的表达式 
DWORD        |ByVal variable As Long    |结果为 Long 类型的表达式 
HWND, HDC,
 HMENU 等。
(Windows句柄)| ByVal variable As Long  |结果为 Long 类型的表达式 
INT, UINT     | ByVal variable As Long  |结果为 Long 类型的表达式 
LONG         |ByVal variable As Long    |结果为 Long 类型的表达式 
LPARAM       |ByVal variable As Long    |结果为 Long 类型的表达式 
LPDWORD      |variable As Long          |结果为 Long 类型的表达式 
LPINT, LPUINT|variable As Long          |结果为 Long 类型的表达式 
LPRECT       |variable As type          |自定义类型的任意变量 
LPSTR, LPCSTR| ByVal variable As String |结果为 String 类型的表达式 
LPVOID       |variable As Any           |任何变量(在传递字符串的时候使用 ByVal) 
LPWORD       |variable As Integer       |结果为 Integer 类型的表达式 
LRESULT      |ByVal variable As Long    | 结果为 Long 类型的表达式 
NULL         |As Any 或ByVal variable As|
             |  Long                    |ByVal Nothing
SHORT        |ByVal variable As Integer |结果为 Integer 类型的表达式 
VOID         |Sub procedure             |不可用 
WORD         |ByVal variable As Integer |结果为 Integer 类型的表达式 
WPARAM       |ByVal variable As Long    | 结果为 Long 类型的表达式 

#7


to:
zyl910(910:分儿,我来了!) 
 holydiablo(鱼头) 

我不能改VC的源码,我这里就只有一个Dll.除了在函数定议前加 _stdcall以外还有什么办法啊,只在VB端作改动。

#8


up

#9


再用C写一个中间函数,调用源函数后用_stdcall返回。
只有_stdcall才能跨编程环境调用。