[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] powershell调用dll将汉字转为拼音

本帖最后由 小白龙 于 2023-3-14 13:36 编辑

本人对Powershell和C++都不太懂

我想将下面链接的代码, 编译成dll, 然后在powershell中调用dll中的函数, 把汉字转为拼音
https://www.cnblogs.com/tangxin-blog/p/5541635.html

对于同时精通PS和C++两种语言的大佬, 可能是小case, 期待大佬能指引一下, 大致写个所用到的软件或工具及实现的过程,注意事项等, 非常感谢

应该有现成的转拼音的DLL了, 我上面是想通过大佬的指引, 以后也能自己修改和编译dll

回复 4# Five66


    多谢大佬指导, 我现在大致明白了思路, VS太大了, 有没有其它的编译小工具呢? 在PS中写函数, 感觉执行速度会慢, 应该没有调用dll快
:

TOP

本帖最后由 小白龙 于 2023-3-14 20:28 编辑

回复 3# pd1


    多谢大佬指导, 现在代码和事项都有了, 就差编译dll了, 我不装vs有别的方式编译DLL吗, 以前看到过文章可以用什么tcc编译器搞,但是不知道怎么搞

TOP

回复 6# czjt1234

多谢大佬指导, 这个贴子, 我主要是想学习下, 编译C或C++为DLL, 然后在PS中调用DLL的方法和事项

TOP

本帖最后由 小白龙 于 2023-3-14 20:33 编辑

回复 2# xczxczxcz

多谢大佬指导, 我懂的太浅了, 自己搞不了  有现成的轮子, 就不自己搞了

TOP

本帖最后由 小白龙 于 2023-3-14 20:34 编辑

回复 4# Five66


    大佬, 我对下面这句话不太懂, DLL能在PS下直接使用?  怎么直接使用, 有代码吗? 麻烦点也想尝试下, 有文章链接吗? 我想试试
想要在ps直接使用,需要转成c++/cli的代码并且以/clr的编译选项编译成dll,有点麻烦

TOP

回复 3# pd1
大佬能指导下吗?
我没有装VS,看了点教程用Tcc编译, 会报下面的错误,
tcc: undefined symbol 'isascii'
我把报错的(// 排除askii 码 )那几行代码删了, 能编译成功, 但是在PS中执行又报下面的错误
Add-Type : c:\Users\Administrator\AppData\Local\Temp\30bxsszt\30bxsszt.0.cs(4) : 无法识别的转义序列

下面是编译的C代码前面的部分, 贴全部就超长了
  1. #include <string.h>
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #define EXPORT __declspec(dllexport)
  6. #define MAXBUFLEN 1024
  7. enum PinyinMode{
  8.     enmPinyinMode_AllUpper = 0,        //全大写
  9.     enmPinyinMode_AllLower,            //全小写
  10.     enmPinyinMode_FirstUpper,        //首字母大写
  11. };
  12. const char* getPinyinByCode(uint32_t code);
  13. void getPinyin(const char* szChinese,char pinyinBuf[],const uint32_t maxBufLen,uint32_t *bufLen,const uint32_t mode);
  14. EXPORT void h2p(const char* szChinese)
  15. {
  16.     uint32_t bufLen = 0;
  17.     char pinyinBuf[MAXBUFLEN] = { 0 };
  18.     //const char* szChinese = "中华人民共和国 People's Republic of China";
  19.     getPinyin(szChinese, pinyinBuf, MAXBUFLEN, &bufLen, enmPinyinMode_FirstUpper);
  20.     printf("%s\n", pinyinBuf);
  21. }
  22. void getPinyin(const char* szChinese,char pinyinBuf[],const uint32_t maxBufLen,uint32_t *bufLen,const uint32_t mode)
  23. {
  24.     *bufLen = 0;
  25.     uint8_t ucHigh, ucLow;
  26.     uint32_t code,i,j;
  27.     const uint32_t chineseLen = strlen(szChinese);
  28.     for (i = 0; i<chineseLen;++i )
  29.     {
  30.         uint8_t c = szChinese[i];
  31.         // 排除askii 码
  32.         if (isascii(c))
  33.         {
  34.             pinyinBuf[(*bufLen)++] = c;
  35.             continue;
  36.         }
  37.         ucHigh = (uint8_t)szChinese[i];
  38.         ucLow  = (uint8_t)szChinese[++i];
  39.         if ( ucHigh <= 0xa0 || ucLow <= 0xa0 )
  40.         {
  41.             continue;
  42.         }
  43.         else
  44.         {
  45.             code = (ucHigh - 0xa0) * 100 + ucLow - 0xa0;
  46.         }
  47.         const char* pBuf = getPinyinByCode(code);
  48.         for (j = 0; j < strlen(pBuf) && (*bufLen) < maxBufLen; ++j)
  49.         {
  50.             char cc = pBuf[j];
  51.             switch(mode)
  52.             {
  53.             case enmPinyinMode_AllUpper:break;
  54.             case enmPinyinMode_AllLower:cc = tolower(cc);break;
  55.             case enmPinyinMode_FirstUpper:if(j!=0)cc = tolower(cc);break;
  56.             }
  57.             pinyinBuf[(*bufLen)++] = cc;
  58.         }
  59.     }
  60. }
  61. }
复制代码

TOP

回复 13# went

多谢大佬, 您用什么编译的? 我用tcc编译会报上面的错误, 另外我的电脑是32位的, 应该用不了64位dll

TOP

回复 12# Five66

大佬能给指导一下上面tcc编译报错的问题吗? 装VS太麻烦了

TOP

本帖最后由 小白龙 于 2023-3-14 22:25 编辑

回复 17# went


封装的函数名怎么看?
用下面的代码执行报错
Add-Type : c:\Users\Administrator\AppData\Local\Temp\ixzwysxg\ixzwysxg.0.cs(4) : 无法识别的转义序列
c:\Users\Administrator\AppData\Local\Temp\ixzwysxg\ixzwysxg.0.cs(3) :         public static class Api{
c:\Users\Administrator\AppData\Local\Temp\ixzwysxg\ixzwysxg.0.cs(4) : >>>                 [DllImport("C:\Users\Administrator\Deskto
p\MyDll.dll")]
c:\Users\Administrator\AppData\Local\Temp\ixzwysxg\ixzwysxg.0.cs(5) :                 public static extern int h2p(String ss);
At line:9 char:1
+ Add-Type -TypeDefinition $code
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type], Exce
   ption
    + FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
  1. $code=@"
  2. using System;
  3. using System.Runtime.InteropServices;
  4. public static class Api{
  5. [DllImport("C:\Users\Administrator\Desktop\MyDll.dll")]
  6. public static extern int h2p(String ss);
  7.     }
  8. "@
  9. Add-Type -TypeDefinition $code
  10. [Api]::h2p("我是中国人")
复制代码

TOP

回复 17# went


    这里有个tcc编译的教程, 下载安装配置都很顺利, 就是报前面的错误, 大佬帮看一下就太感谢了,
http://www.taodudu.cc/news/show-4919115.html

TOP

本帖最后由 小白龙 于 2023-3-14 23:32 编辑

回复 21# went

多谢大佬指导,

https://www.cnblogs.com/tangxin-blog/p/5541635.html
我直接用上面的链接的C代码, 拷到PSPad中, 然后TCC编译, 一下就能生成exe, 编译速度非常快, 但是修改main函数为下面代码就报错了, 应该要改一下代码

各位大佬可以按下面的链接试一下TCC编译器, 才几百K
http://www.taodudu.cc/news/show-4919115.html
  1. extern "C" _declspec(dllexport)void h2p(const char* szChinese)
  2. {
  3.     uint32_t bufLen = 0;
  4.     char pinyinBuf[MAXBUFLEN] = { 0 };
  5.     //const char* szChinese = "中华人民共和国 People's Republic of China";
  6.     getPinyin(szChinese, pinyinBuf, MAXBUFLEN, &bufLen, enmPinyinMode_FirstUpper);
  7.     printf("%s\n", pinyinBuf);
  8. }
复制代码

TOP

本帖最后由 小白龙 于 2023-3-14 23:43 编辑

回复 22# Five66


    多谢大佬指导, 改完之后不再报错了, 也能输出了, 但是输出是错的, 我想输出 中国人  的拼音, 但是显示的拼音是 Juan?Bang

我把main改为了如下
  1. __declspec(dllexport) void h2p(const char* szChinese)
  2. {
  3.     uint32_t bufLen = 0;
  4.     char pinyinBuf[MAXBUFLEN] = { 0 };
  5.     //const char* szChinese = "中华人民共和国 People's Republic of China";
  6.     getPinyin(szChinese, pinyinBuf, MAXBUFLEN, &bufLen, enmPinyinMode_FirstUpper);
  7.     printf("%s\n", pinyinBuf);
  8.     MessageBox(0, pinyinBuf, "title", MB_TOPMOST);
  9. }
复制代码

TOP

本帖最后由 小白龙 于 2023-3-15 00:31 编辑

回复 21# went


    大佬, 下载后试了一下您的全套, 还是报错, 应该可能是64位dll原因, 我再试下32位的
Exception calling "getPinyin" with "5" argument(s): "试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)"
At C:\Users\Administrator\Desktop\pinyin\test.ps1:17 char:1
+ [Api]::getPinyin($src,$buf,1024,[ref]$len,2)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : BadImageFormatException
  1. cls
  2. $code=@"
  3.     using System;
  4.     using System.Runtime.InteropServices;
  5.     public static class Api{
  6.         [DllImport("pinyin.dll")]
  7.         public static extern void getPinyin(byte[] src,byte[] buf,uint max_len,ref uint buf_len,uint mode);
  8.     }
  9. "@
  10. Add-Type -TypeDefinition $code
  11. $s = "中华人民共和国 People's Republic of China"
  12. $src=[System.Text.Encoding]::Default.GetBytes($s)
  13. $buf = New-Object 'byte[]'(1024)
  14. $len = 0
  15. [Api]::getPinyin($src,$buf,1024,[ref]$len,2)
  16. [System.Text.Encoding]::Default.GetString($buf,0,$len)
复制代码

TOP

回复 26# went


    多谢大佬, 用这个 //config=x64  编译的成功了, 是不是反了? 现在生成的文件小点了

TOP

返回列表