python 嵌入vb的有关问题,有vb原码,运行失败,望高人看看,不胜感激

python 嵌入vb的问题,有vb原码,运行失败,望高人看看,不胜感激
本帖最后由 bcrun 于 2013-11-11 11:53:54 编辑
Private DeclareFunction Py_Initialize Lib "python25" () As Long
Private Declare Function Py_IsInitialized Lib "python25" () As Long
Private Declare Function Py_Finalize Lib "python25" () As Long

Private Declare Function Py_GetPath Lib "python25" () As Long
Private Declare Function Py_GetVersion Lib "python25" () As Long
Private Declare Function PyRun_SimpleString Lib "python25" (commandAs Any) As Long

Sub Main()
Py_Initialize
init = Py_IsInitialized
MsgBox init
MsgBox Py_GetPath
ver = PyGetVersion
MsgBox ver
PyRun_SimpleString "import sys"
PyRun_SimpleString "1+1"
PyRun_SimpleString "print 'Hello'*5" + Chr$(13)
Py_Finalize
End Sub

这是VB6中的代码,运行时提示“Dll调用约定错误” 在“PyRun_SimpleString "import sys"”这一行
请高手解答,

------解决方案--------------------
Private Declare Function PyRun_SimpleString Lib "python25" (commandAs Any) As Long
->
Private Declare Function PyRun_SimpleString Lib "python25" (command As Any) As Long
------解决方案--------------------
PyRun_SimpleString 可能和VB不兼容,它不遵循标准的stdcall调用约定,或者,你的函数原型不对。
------解决方案--------------------

Declare Function PyRun_SimpleString CDecl Lib "python25" (ByVal Str As String) As Integer

看到有个代码这么声明的,看不懂,也没试过,试试看?
------解决方案--------------------
引用:

Declare Function PyRun_SimpleString CDecl Lib "python25" (ByVal Str As String) As Integer

看到有个代码这么声明的,看不懂,也没试过,试试看?

我估计还是一样的效果。

“调用约定错误”,多数是参数个数不对。
所以,我觉得关键是“函数原型”可能不相符。

------解决方案--------------------
引用:
Quote: 引用:


Declare Function PyRun_SimpleString CDecl Lib "python25" (ByVal Str As String) As Integer

看到有个代码这么声明的,看不懂,也没试过,试试看?

我估计还是一样的效果。

“调用约定错误”,多数是参数个数不对。
所以,我觉得关键是“函数原型”可能不相符。

这个CDecl在代码里他会变色,变成关键字的颜色,帮助里没说起这个关键字,但是调用约定错误里最后一条又在提这个

------解决方案--------------------
不行,VB 不能直接调用 CDECL 的 DLL 函数,将触发约定错误。下面是一个通过处理调用 CDECL 的例子,但比较复杂。
[Visual Basic]
 
Imports System
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices
Public Class LibWrap
' Visual Basic does not support varargs, so all arguments must be 
' explicitly defined. CallingConvention.Cdecl must be used since the stack 
' is cleaned up by the caller. 
' int printf( const char *format [, argument]... )
<DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
Overloads Shared Function printf ( _
    format As String, i As Integer, d As Double) As Integer
End Function
<DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
Overloads Shared Function printf ( _
    format As String, i As Integer, s As String) As Integer
End Function
End Class 'LibWrap
Public Class App
    Public Shared Sub Main()
        LibWrap.printf(ControlChars.CrLf + "Print params: %i %f", 99, 
                       99.99)
        LibWrap.printf(ControlChars.CrLf + "Print params: %i %s", 99, _
                       "abcd")
    End Sub 'Main
End Class 'App
   
[C#] 
using System;
using System.Runtime.InteropServices;
public class LibWrap
{
// C# doesn't support varargs so all arguments must be explicitly defined.