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的时候就已经碰到了
这个问题在我刚用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 类型的表达式
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端作改动。
zyl910(910:分儿,我来了!)
holydiablo(鱼头)
我不能改VC的源码,我这里就只有一个Dll.除了在函数定议前加 _stdcall以外还有什么办法啊,只在VB端作改动。
#8
up
#9
再用C写一个中间函数,调用源函数后用_stdcall返回。
只有_stdcall才能跨编程环境调用。
只有_stdcall才能跨编程环境调用。
#1
__stdcall
#2
LPCSTR *只能ByVal …… As Long传地址
#3
说的详细点好吗?不是LPCSTR * ,是LPCSTR 这两个有没有区别我不知道,因为我VC不熟,应该是不一样的吧。
#4
__Stdcall
这个问题在我刚用VC的时候就已经碰到了
这个问题在我刚用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 类型的表达式
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端作改动。
zyl910(910:分儿,我来了!)
holydiablo(鱼头)
我不能改VC的源码,我这里就只有一个Dll.除了在函数定议前加 _stdcall以外还有什么办法啊,只在VB端作改动。
#8
up
#9
再用C写一个中间函数,调用源函数后用_stdcall返回。
只有_stdcall才能跨编程环境调用。
只有_stdcall才能跨编程环境调用。