首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Sketchup中调用dll库时出现的Ruby Sketchup错误

在Sketchup中调用dll库时出现的Ruby Sketchup错误
EN

Stack Overflow用户
提问于 2014-02-24 04:19:40
回答 1查看 672关注 0票数 1

我希望Sketchup可以导入多个文件。但是不幸的是,Sketchup并不支持它。所以我创建了一个dll库。它调用Window API函数:用于显示多选择对话框的GetOpenFileName,获取选定的文件名并以格式化的字符串显示它们(所选的目录\ filename1 \filename2 2.)。然后我把它和Win32API.so放在Sketchup的插件文件夹中。但是当我打开Sketchup时,它会显示错误:

错误加载文件GetProcAddress: ShowDialog或ShowDialogA (ShowDialog是dll的一个函数)

这是我的dllmain.cpp代码(C++代码)

代码语言:javascript
复制
#define EXPORT _declspec(dllexport)
HWND hDlg = NULL;
wchar_t* buffer = new wchar_t[32768];

EXPORT void ShowDialog(void)
{
    OPENFILENAME ofn;
    wchar_t szFile[32768];
    // Initialize OPENFILENAME
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hDlg;
    ofn.lpstrFile = (wchar_t*)szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags =  OFN_ALLOWMULTISELECT | OFN_ENABLESIZING | OFN_EXPLORER;
    if(GetOpenFileName(&ofn) == TRUE)
    {
        if(szFile[ofn.nFileOffset-1] != '\0')
        {
            wcscpy_s(buffer,sizeof(szFile),szFile);
        }
        else
        {
            //Multi-select
            wchar_t* p= szFile;
            int i =0;
            while(*p)
            {
                wchar_t* temp = new wchar_t[1024];
                //Copy p into temp
                wcscpy_s(temp,1024,p);
            if(i==0)
            {
                wcscpy_s(buffer,1024,temp);
            }
            else
            {
                wcscat_s(buffer,1024,temp);
            }
            wcscat_s(buffer, sizeof(buffer) * wcslen(buffer), L"|");
            i++;
            p += lstrlen(p) + 1;
        }
    }
    int len = wcslen(buffer);
    buffer[len]='\0';
}



EXPORT void GetResult(char* pString)
{
    int len = wcslen(buffer);
    for(int i =0 ; i < wcslen(buffer);i++)
    {
        pString[i] = (char)buffer[i];
    }
    pString[len]='\0';
}

这是我的红宝石文件中的脚本。

代码语言:javascript
复制
require 'sketchup.rb'
require "Win32API"
path = Sketchup.find_support_file("\Plugins\\")
#my dll has name MultiUploadProject.dll
mydll = path + "\\MultiUploadProject.dll"
if (!FileTest.exist?( mydll ) )
    UI.messagebox(sprintf("MultiUploadProject.dll not found in SketchUp plugins folder: %s\n",mydll))
end
ShowDialog = Win32API.new(mydll,"ShowDialog",["V"],"V")
GetResult = Win32API.new(mydll,"GetResult",["P"],"V")
def load_dialog
    ShowDialog.call
    string = " " * 32768
    GetResult.call(string)
end

我使用Visual 2012构建dll,我的Sketchup是Sketchup 8

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-25 05:19:37

导出需要是C导出(没有C++名称损坏)。尝试像这样定义导出宏:

代码语言:javascript
复制
#define EXPORT extern "C" _declspec(dllexport)

或在extern "C“中定义导出的函数

代码语言:javascript
复制
extern "C" {

// Exported functions here.

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21978810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档