Моя C / C ++ DLL создана для 32- и 64-битных сред Windows.Два программиста, работающих в .NET (C # и VB.NET), говорят, что когда они собирают своих клиентов для 32-битных систем, все работает правильно.Но когда они собираются для 64-битных систем, запуск заканчивается нарушением прав доступа.
Я не программист .NET, но я могу загрузить их процесс и пройти по коду DLL в отладчике C ++.Запуск .NET определенно сталкивается с поврежденной памятью, которая не возникает, когда клиент - тот, который я написал в C ++ / VCL.
Мой вопрос: есть ли что-то особенное в настройках проекта .NET для взаимодействия с 64-битная C / C ++ DLL, которая отличается от того, что работает под 32-битной ?
Возможно, уместно, но я не могу доказать это: DLL построена с Настройка символов = Не установлено для UTF-8 / ASCII.Я не знаю, построен ли клиент VB.NET для Unicode, но я предполагаю, что это может создать проблемы.
РЕДАКТИРОВАНИЕ ДЛЯ ДОБАВЛЕНИЯ объявлений от клиентов VB.NET, C # и C ++ DLL
Declare Function Edit_RunEdits Lib "EDITS50.DLL" (ByVal smfID As Integer, _
ByVal edit_set_tag As String, _
ByVal layout_tag As String, _
ByVal data As String, _
ByVal edit_options As Integer, _
ByRef errors_count As Integer, _
ByVal owner As IntPtr, _
ByVal callback_func As IntPtr) As Integer
Это объявление C #:
[DllImportAttribute("EDITS50.dll", EntryPoint = "Edit_RunEdits")]
public static extern int Edit_RunEdits(int smfID,
[InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string edit_set_tag,
[InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string layout_tag,
[InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string data,
int edit_options,
ref int errors_count,
System.IntPtr owner,
System.IntPtr callback_func);
Это сторона C ++:
#define EDIT_API __declspec(dllexport) __stdcall
extern "C" int EDIT_API Edit_RunEdits( const int smfID, const char* edit_set_tag,
const char* layout_tag,
const char* data,
const int edit_options,
int* errors_count,
void* owner,
void* callback_func);