Home |
Search |
Today's Posts |
#1
Posted to microsoft.public.excel.programming
|
|||
|
|||
Calling a C++ DLL which returns a String
Hi,
following problem: in my EXCEL VBA-code I try to call a function from a C++ DLL which has the following declaration: long TestFunc( char* TestStr ); In this function the TestStr is modified. VBA-code: Declare Function TestFunc& lib "TestDll.dll" ( VBAString as String ) Dim DummyStr as String DummyStr = "this is a test" ret = TestFunc( DummyStr ) BUT, after calling TestFunc EXCEL crashes... As long as I don't touch the string in the C++ funtion everything is ok. Any other idea how to return a string from a DLL? Thanks, Johann |
#2
Posted to microsoft.public.excel.programming
|
|||
|
|||
Calling a C++ DLL which returns a String
I don't know how your DLL was constructed; 'normal' Win32, as a Static
Library, or via MFC. But there is another way to import C-functions in VB(A). This is how I get an Int. DLL.DLL: // DLL.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" UINT DLL_Function_Name(); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } UINT DLL_Function_Name() { return 12345; } Then, DLL.DEF: EXPORTS DLL_Function_Name Finally, in Excel VBA: Option Explicit Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Function DoDLLFunction() As Integer Dim X As Long Dim Y As Long X = LoadLibrary("C:\Excel Projects Usenet\DLL2.DLL") Y = GetProcAddress(X, "DLL_Function_Name") MsgBox Y DoDLLFunction = CallWindowProc(Y, ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&) FreeLibrary X End Function ....will give 12345 in the ActiveCell by entering =DoDLLFunction() Maybe you can experiment with this. hans Hans "Vorreiter Johann (IFDA)" schreef in bericht ... Hi, following problem: in my EXCEL VBA-code I try to call a function from a C++ DLL which has the following declaration: long TestFunc( char* TestStr ); In this function the TestStr is modified. VBA-code: Declare Function TestFunc& lib "TestDll.dll" ( VBAString as String ) Dim DummyStr as String DummyStr = "this is a test" ret = TestFunc( DummyStr ) BUT, after calling TestFunc EXCEL crashes... As long as I don't touch the string in the C++ funtion everything is ok. Any other idea how to return a string from a DLL? Thanks, Johann |
#3
Posted to microsoft.public.excel.programming
|
|||
|
|||
Calling a C++ DLL which returns a String
Thanks Hans,
this works fine, but what to do if I want to return a string instead of an UINT?? Regards, Johann "mct" wrote in message ... I don't know how your DLL was constructed; 'normal' Win32, as a Static Library, or via MFC. But there is another way to import C-functions in VB(A). This is how I get an Int. DLL.DLL: // DLL.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" UINT DLL_Function_Name(); BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } UINT DLL_Function_Name() { return 12345; } Then, DLL.DEF: EXPORTS DLL_Function_Name Finally, in Excel VBA: Option Explicit Public Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long Public Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Function DoDLLFunction() As Integer Dim X As Long Dim Y As Long X = LoadLibrary("C:\Excel Projects Usenet\DLL2.DLL") Y = GetProcAddress(X, "DLL_Function_Name") MsgBox Y DoDLLFunction = CallWindowProc(Y, ByVal 0&, ByVal 0&, ByVal 0&, ByVal 0&) FreeLibrary X End Function ...will give 12345 in the ActiveCell by entering =DoDLLFunction() Maybe you can experiment with this. hans Hans "Vorreiter Johann (IFDA)" schreef in bericht ... Hi, following problem: in my EXCEL VBA-code I try to call a function from a C++ DLL which has the following declaration: long TestFunc( char* TestStr ); In this function the TestStr is modified. VBA-code: Declare Function TestFunc& lib "TestDll.dll" ( VBAString as String ) Dim DummyStr as String DummyStr = "this is a test" ret = TestFunc( DummyStr ) BUT, after calling TestFunc EXCEL crashes... As long as I don't touch the string in the C++ funtion everything is ok. Any other idea how to return a string from a DLL? Thanks, Johann |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
Similar Threads | ||||
Thread | Forum | |||
How do I return a text string when a calculation returns a non who | Excel Worksheet Functions | |||
Help formula that returns a text string from another sheet | Excel Worksheet Functions | |||
A function that returns the formula of a cell as a string | Excel Worksheet Functions | |||
use concatenate function to put carrage returns in a text string | Excel Worksheet Functions | |||
calling variable within string | Excel Worksheet Functions |